【问题标题】:Prevent c++ istream from locking when calling 'get' and 'peek'调用'get'和'peek'时防止c ++ istream锁定
【发布时间】:2019-02-12 04:53:09
【问题描述】:

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

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

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

提前致谢!

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

【问题讨论】:

  • @Galik,谢谢,我会试试的
  • @Galik,仅适用于标准流,不适用于 istream
  • 我不知道有一个标志或#define 可以用来禁用它。标准要求流是线程安全的,所以我不确定是否会禁用它。
  • @NathanOliver,嗯,你知道有什么类似的 istream 替代品可以用来代替线程安全性不那么严格的吗?
  • 有C IO函数。

标签: c++ performance locking istream


【解决方案1】:

虽然不受支持,但似乎有一些黑客式的做法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多