是std :: ifstream线程安全&无锁?

时间:2010-05-02 17:34:55

标签: c++ thread-safety ifstream lock-free file-locking

我打算使用std :: ifstream执行从多个线程读取单个文件的开放。我担心的是std :: ifstream是否是线程安全的&无锁?

更多详情:

  1. 我在Ubuntu上使用g ++ 4.4& Leopard上的Windows XP,4.0版。
  2. 每个线程都创建自己的std :: ifstream
  3. 实例

    提前致谢!

3 个答案:

答案 0 :(得分:2)

这是实现定义的。标准C ++对线程一无所知,因此对线程的任何假设本身都会调用未指定的或实现定义的行为。

我们需要您使用的平台更具体,但假设ifstream是线程安全的还是无锁的,这可能是不合理的。如果不出意外,OS级别调用中可能涉及实际从文件读取的锁定,在这种情况下,不可能实现真正的无锁实现。即使没有它,每次从ifstream读取都需要检查几个格式标志,并且需要根据读取期间发生的情况更新标志位。 (即istream::good()istream::operator bool)由于所有这些都不可能以原子方式完成,因此假设istream的线程安全特性很多是不合理的。

答案 1 :(得分:2)

请参阅http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html

在编写该手册页时,GCC的标准库遵循操作系统的C stdio文件缓冲。他们避免将状态保持在C FILE结构之外,并通过它实现某种程度的安全。

由于C stdio库在最后一个I / O操作周围的文件中实现了单个范围的缓冲区,因此我看不到lock-free implementation是如何实现的。必须连续处理文件上的操作。也许无缓冲模式可能会有所帮助;这比我现在想做的研究多一点。

答案 2 :(得分:1)

所有std库都是线程安全的,但不是“异步”安全的。因此,您可以从不同的线程调用相同的函数,但不能在相同的对象上调用。