簡體   English   中英

多線程文件

[英]Multi-Threading with files

所以,假設我有以下代碼,我打開一個文件,逐行讀取內容,然后在其他地方使用每行代碼,然后當我完成文件的倒帶時。

FILE *file = Open_File();
char line[max];
while (!EndofFile()) 
{
    int length = GetLength(line);
    if (length > 0) 
    {
       DoStuffToLine(line)
    }
}
rewind(file);

我想知道是否有一種方法可以在這里使用線程來添加並發性。 因為我只是在閱讀文件而不是寫信給我,所以我覺得我不必擔心比賽條件。 但是我不確定如何處理while循環中的代碼,因為如果一個線程在文件上循環而另一個線程同時在文件上循環,它們是否會導致彼此跳過線,使其他錯誤等? 有什么好辦法來解決這個問題?

如果您正在嘗試這樣做以提高讀取性能,那么您可能會感到失望,因為這幾乎肯定會受到磁盤I / O限制。 添加更多線程無助於操作系統和磁盤控制器更快地獲取數據。

但是,如果您嘗試並行處理數據,那就另當別論了。 在這種情況下,我會將整個文件讀入某個內存緩沖區,然后讓你的線程並行處理它。 這樣你就不用擔心線程安全,而是要重新調整文件指針或任何其他煩人的問題。

當然,您可能仍需要為多線程部分使用其他鎖定機制,具體取決於您正在做什么,但您不必擔心開始訪問文件時標准庫將要執行的操作有多個線程。

並發性增加了一些競爭條件問題:

1.在循環開始時評估EndofFile()函數,可能總是發生這個函數為兩個線程返回true,然后一個線程到達文件末尾而另一個線程嘗試讀取文件。你永遠不知道當線程可能正在執行時;
2.同樣對GetLength函數有效:當一個線程有長度信息時,長度可能會改變,因為另一個線程可能讀取另一行;
3.您正在按順序讀取文件,即使您回放它,也可能始終發生IO指針的當前位置被其他某個線程更改。

此外,正如Telgin指出的那樣,讀取文件不是CPU綁定的,而是I / O綁定,系統讀取文件也是如此。由於需要一些鎖定而無法提高性能,並且鎖定以保證線程安全引入開銷。

我不確定這是最好的方法。 但是,您可以閱讀該文件。 然后將其存儲在兩個單獨的對象中,並讀取對象而不是文件。 確保事后做好清理工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM