2014-04-26 91 views
1

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

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

另外的文件夹中的文件是动态(有人可以把文件夹中,同时应用程序运行时),所以如果需要锁定要我把它放在文件夹级别或每个文件锁定动态需要?

回答

3

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

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

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

2

如果使用相同的ifstream,那么你有数据的比赛(有一个stream对象中没有锁定,按照标准)

如果你读了使用不同的数据流,那么它的安全。

但我怀疑使用多线程读取磁盘上的文件会给你带来好处。已经显示(多次)在多个线程中读取文件比从单个线程读取文件要慢得多(当然,假设您的“搜索”效率相当高)。