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

标签 c++ multithreading locking filestream ifstream

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

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

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

最佳答案

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

如果文件是动态的,我猜你的应用程序“消费”了这些文件,不是吗?如果是这种情况,您必须同步线程:一个线程必须列出目录中的文件,并将文件分配给读取文件的其他线程。如果所有线程都读取文件而它们之间没有通信,它们将读取/使用同一个文件多次。

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

关于C++ 流对象线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317690/

相关文章:

c++ - Doxygen -- 多个函数的单个注释 block

c++ - 如何仅使用一个键来使用 std::binary_search ?

java - 执行超时后返回的长时间计算

c# - 需要一个长期运行的模式或解决方案,该模式或解决方案需要循环执行并在每个线程完成后更新UI

java - 锁定两种方法但允许一种方法运行多线程

c++ - 在整个项目中搜索 Eclipse CDT 中的包含项

c++ - 我的 C++ 程序如何访问计算机的日期和时间来打印和使用当前年份?

python - 处理另一个线程中的异常

C# 锁定 Vault 对象

java - Apache 会杀死长时间运行的页面请求线程吗?