2014-03-13 14 views
1

我有一個名爲「data.txt」的文件,總是有50個字節的數據。正在讀取和寫入不同字節範圍線程安全的相同文件嗎?

我有兩個線程。

第一個線程,讀從字節0到字節50的內容:

while(1){ 
    char buf[50]; 
    FILE* fp = fopen("data.txt","r"); 
    fread(buf,1,50,fp); 
    /* process data */ 
    fclose(fp); 
} 

第二個線程,(第一個50個字節之後=總是)數據追加到該文件:

while(1){ 
    FILE* fp = fopen("data.txt","a"); 
    fwrite("hello\n",1,6,fp); 
    fclose(fp); 
} 

這個解決方案是線程安全的和便攜的嗎? (沒有分段錯誤,沒有數據不一致,...)

+0

這是不安全的,除非你可以保證寫入的兩個區域不會重疊,以塊爲單位。 –

回答

1

正如我在你的其他相關文章中寫道的,據我所知,它不應該崩潰。不管它是否正確寫入和讀取,我都不知道。

如果您在POSIX系統上:您是否考慮過使用fifo(參見http://man7.org/linux/man-pages/man7/fifo.7.html)?我的印象是文件系統只是你潛在通信需求的助手,即實際的文件並不重要。

0

只有一個位置指示符與文件流關聯,問題在於如果以附加模式打開文件,位置指示符會在文件結束之前移到文件末尾每寫。您可以用fseek()重新定位位置指示器進行讀取,但只要您寫入文件,位置指示器就會返回到文件末尾。

編輯:
這是確定的,因爲每個線程每個文件描述符將是相互獨立的。

+0

感謝您的回覆,但我明白這是一個正常行爲,「hello \ n」被附加倍數。如果我們不把這個問題看作是一個問題,那麼代碼是否是線程安全的(沒有分段錯誤,讀取第一個線程總是工作並返回好的數據,等等)?謝謝。 – user3412796

+0

每當它按照您的預期工作時,並不能保證。如果寫入'fread()'被調用的時間最後一次,它不會返回好數據。 – jfly

+0

我不明白爲什麼好的數據不能被fread返回,因爲前50個字節在程序的開始處是固定的,並且有兩個不同的FILE指針和兩個不同的內部指針。 – user3412796