4

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

更多细节:

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

提前致谢!

4

3 回答 3

2

那是实现定义的。标准 C++ 完全没有提到线程,因此任何关于线程的假设都会固有地调用未指定或实现定义的行为。

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

于 2010-05-02T17:43:28.937 回答
2

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

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

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

于 2010-05-02T18:44:31.787 回答
0

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

于 2010-05-02T17:42:31.513 回答