2014-04-26 136 views
1

我需要在具有多個線程的C++應用程序中的文件夾中的文件中提供文本搜索。 如果兩個線程試圖以只讀模式打開相同的文件,它將導致數據競爭或多個線程可以使用流對象讀取文件。C++流對象線程安全嗎?

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

另外的文件夾中的文件是動態(有人可以把文件夾中,同時應用程序運行時),所以如果需要鎖定要我把它放在文件夾級別或每個文件鎖定動態需要?

回答

3

多個線程可以打開同一個文件並讀取它。這沒有問題,但線程不能共享std :: ifstream實例。因此,你的代碼可以被多個線程執行。

如果文件是動態的,我猜你的應用程序「消耗」了文件,nop?如果是這種情況,則必須同步線程:一個線程必須列出目錄中的文件,並將文件分配給其他讀取文件的線程。如果所有線程都在沒有通信的情況下讀取文件,它們將讀取/消耗多次相同的文件。

對於鎖,我不知道:這取決於你在做什麼...刪除文件?寫在這些文件?重命名他們?如果您需要某些性能,則每個文件的一個鎖定會更好。

2

如果使用相同的ifstream,那麼你有數據的比賽(有一個stream對象中沒有鎖定,按照標準)

如果你讀了使用不同的數據流,那麼它的安全。

但我懷疑使用多線程讀取磁盤上的文件會給你帶來好處。已經顯示(多次)在多個線程中讀取文件比從單個線程讀取文件要慢得多(當然,假設您的「搜索」效率相當高)。