【发布时间】:2011-08-14 21:28:47
【问题描述】:
我正在处理一些现有代码,这些代码正在反序列化存储在文本文件中的对象(我可能需要阅读数千万个这些对象)。首先将文件的内容读入wstring,然后从中生成wistringstream。在程序上运行 Very Sleepy 分析器表明它在以下调用堆栈中花费了大约 20% 的时间:
Mtxlock or RtlEnterCritialSection
std::_Mutex::_Lock
std::flush
std::basic_istream<wchar_t, std::char_traits<wchar_t> >::get
<rest of my program>
和类似的std::_Mutex::_Unlock。我正在使用 Visual C++ 2008。
查看istream,我看到它构造了一个sentry 对象,该对象在底层basic_streambuf 上调用_Lock 和_Unlock 方法。这反过来只需在与该缓冲区关联的_Mutex 上调用_Lock 和_Unlock。然后定义如下:
#if _MULTI_THREAD
// actually defines non-empty _Lock() and _Unlock() methods
#else /* _MULTI_THREAD */
void _Lock()
{ // do nothing
}
void _Unlock()
{ // do nothing
}
#endif /* _MULTI_THREAD */
看起来 _MULTI_THREAD 在yvals.h 中设置为
#define _MULTI_THREAD 1 /* nontrivial locks if multithreaded */
现在,我知道永远不会有另一个线程尝试访问此缓冲区,但在我看来,在使用标准 iostream 时无法绕过此锁定,这看起来既奇怪又令人沮丧。我错过了什么吗?有解决办法吗?
【问题讨论】:
标签: c++ multithreading visual-c++ iostream istream