在调用 'get' 和 'peek' 时防止 c++ istream 锁定

Prevent c++ istream from locking when calling 'get' and 'peek'

我目前正在使用 istream 读取 C++ 中的文本文件,我注意到 istream 在每次读取后锁定文件(特别是 istream get 和 peek 方法)会产生大量开销。

如果我没理解错的话,这种锁定是为了线程安全,但我只打算使用单线程,所以感觉没有必要。

有什么方法可以防止从 istream 读取时线程锁定?

提前致谢!

P.S.: 我附上了一张 VTune 结果图像,其中包含时间花费的概览。

虽然它不受支持,但似乎有一些 hacker-y 方法可以做到这一点:

对于 char = in.get() 或 in.get(char&),使用 std::sbumpc.

对于 char = in.peek(),使用 std::sgetc.

所以:

// Old:
char c = in.get();
char p = in.peek();

// New:
char c = in.rdbuf()->sbumpc();
char p = in.rdbuf()->sgetc();

请注意,这些方法不是线程安全的,也不会自动检测eof。仅在性能至关重要时使用,并注意自己检查。