我打算使用 std::ifstream 执行打开以从多个线程中读取单个文件。我担心的是 std::ifstream 是否是线程安全且无锁的?
更多细节:
- 我在 Ubuntu 和 Windows XP 上使用 g++ 4.4,在 Leopard 上使用 4.0。
- 每个线程创建自己的 std::ifstream 实例
提前致谢!
我打算使用 std::ifstream 执行打开以从多个线程中读取单个文件。我担心的是 std::ifstream 是否是线程安全且无锁的?
更多细节:
提前致谢!
那是实现定义的。标准 C++ 完全没有提到线程,因此任何关于线程的假设都会固有地调用未指定或实现定义的行为。
我们需要您使用的平台更具体,但假设 ifstream 是线程安全的或无锁的可能是不合理的。如果不出意外,实际上执行从文件读取的操作系统级别调用中可能涉及锁,在这种情况下,不可能实现真正的无锁实现。即使没有这个,从 ifstream 中读取的每次都需要检查几个格式标志,并且需要根据读取期间发生的情况更新标志位。(即istream::good()
和istream::operator bool
)由于不可能以原子方式完成所有这些操作,因此对istream
' 的线程安全特性做出太多假设是不合理的。
请参阅http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html。
在编写该手册页时,GCC 的标准库遵循操作系统的 C stdio 文件缓冲。他们避免将状态保持在 CFILE
结构之外,并通过它实现一定程度的安全性。
由于 C stdio 库在最后一次 I/O 操作周围的文件中实现了单个范围的缓冲区,因此我看不到无锁实现是如何可能的。对文件的操作必须串行处理。也许无缓冲模式会有所帮助;这比我现在想做的研究多一点。
所有标准库都是线程安全的,但不是“异步”安全的。因此,您可以从不同的线程调用相同的函数,但不能在相同的对象上调用。