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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用'get'和'peek'时阻止c ++ istream锁定相关的知识,希望对你有一定的参考价值。

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

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

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

提前致谢!

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

VTune image of all the lock_file sections

答案

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

对于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。仅在性能至关重要时使用,并自行检查。

以上是关于调用'get'和'peek'时阻止c ++ istream锁定的主要内容,如果未能解决你的问题,请参考以下文章

尝试diff'[object Object]'时出错。当我调用get时,只允许数组和迭代

app.get('/')在网站打开时没有被调用

GET类型接口调用

Google API:在调用get_credentials()时表单KeyError:'_ module'

Python TypeError: get_logger() missing 1 required positional argument: 'self'

当使用带有immutable-js的redux时 - 你在选择器上调用了JS()吗?或者你在渲染函数中使用.get('prop')?