C ++流对象线程安全吗?

时间:2014-04-26 23:37:43

标签: c++ multithreading locking filestream ifstream

我需要在具有多个线程的C ++应用程序的文件夹中的文件中提供文本搜索。 如果两个线程试图以只读模式打开同一个文件,它会导致数据争用,或者多个线程可以使用流对象读取文件。?

  std::ifstream ifs ("test.txt");
  std::filebuf* inbuf  = ifs.rdbuf();

此外,文件夹中的文件是动态的(有人可以在应用程序运行时将文件放在文件夹中)所以如果需要锁定,我应该将其保留在文件夹级别还是动态需要每个文件锁定?

2 个答案:

答案 0 :(得分:3)

多个线程可以打开同一个文件并读取它。这没问题,但线程不能共享std :: ifstream实例。因此,您的代码可以由多个线程执行。

如果文件是动态的,我猜你的应用程序"消费"文件,nop?如果是这种情况,则必须同步线程:一个线程必须列出目录中的文件,并将文件分配给读取文件的其他线程。如果所有线程在没有通信的情况下读取文件,它们将读取/使用同一文件多次。

对于锁,我不知道:这取决于你在做什么......删除文件?写在这些文件?重命名他们?如果您需要一些性能,每个文件的锁定更好。

答案 1 :(得分:2)

如果你使用相同的ifstream,那么你就有了数据竞赛(根据标准,stream对象中没有锁定)

如果您使用不同的流阅读,那么它是安全的。

我怀疑使用多个线程读取磁盘上的文件会给你带来任何好处。已经(多次)证明,读取多个线程中的文件比从单个线程读取文件慢得多(假设您的“搜索”当然是合理有效的)。