簡體   English   中英

在多線程環境(C ++)中讀寫文件的最佳方法

[英]Best way to read/write file in multithreaded environment (C++)

我有一個讀取和寫入文件的多線程程序。 一個線程接收數據並將其寫入文件。 每250 Mb數據將創建一個新文件。 多個其他線程可以讀入這些文件以檢索數據。 我正在使用C ++ std文件流。

為防止出現問題,我當前的實現對同一文件使用兩個文件描述符:一個用於讀取器,一個用於寫入器。 互斥鎖可防止同時訪問多個文件,並且每次互斥鎖所有者需要時,文件描述符位置都會移動。

我確實需要能夠盡快讀取文件,而互斥鎖並沒有真正幫助我。

首先,我想知道在每個平台上同時讀寫文件還是多次讀取是否安全。 其次,如果可以的話,我想知道對於HDD來說,像“磁盤讀寫頭”這樣的硬件如何安全? 該軟件一直在磁盤上工作以保存數據,並且我不希望我的算法減少太多的硬盤壽命(已經很短了)。

謝謝您的幫助

關於多個線程讀取同一文件沒有問題。

現在,如果我正確理解了您的描述,則不會修改已經寫入的數據,只需數據連續追加到文件中,直到達到250Mb,然后繼續在新文件上寫入即可。

在這種情況下,您可能根本不需要互斥體。 例如,您也許可以將整個“文件”保存到內存中,直到達到250mb,然后才將其全部寫入磁盤,因此您知道磁盤上已經沒有任何文件了,並且可以自由閱讀而無后顧之憂。 對於仍在寫入的文件,您可以具有一個全局整數,該整數保存已經寫入了多少個字節(或字符串或使用的任何內容),並且讀取線程受該整數限制,不需要鎖定。 ,只要在寫入數據后才更新整數即可。 (因為您說過只有1個線程在寫數據)。

只需讀取整數就不會損壞它,即使同時由多個線程完成並由一個線程寫入也是如此,因此這將確保您的讀取器線程不會超出限制讀取,並且該限制始終是安全且一致的,而寫程序線程可以在保證完成之前不會被讀線程打擾的區域中和平地寫入數據。

至於第二個問題,如果您確實能夠將當前正在寫入的文件完全保留在內存中,那將節省一些HDD的使用以及時間。 此外,請記住,大多數現代HDD具有32Mb +的緩存,因此,除非您有大量線程始終讀取隨機文件及其隨機部分,否則並非每次讀寫都會直接命中HDD本身。 如果真是這樣,您可能無法做很多事情來幫助HDD。 如果不是這種情況,就不必擔心太多了,因為操作系統和緩存將按原本打算的方式進行:)

暫無
暫無

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

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