[英]Issue with C++ Multithreaded file read running on virtual machines
這更像是一個概念性問題。 我正在使用的遺留代碼具有C ++線程實現來模擬並行文件讀取。 它處理多線程文件讀取的方式是將一個數據塊(比如2^20 bytes
)從文件傳輸到char* array
然后多個線程讀取該數組的專用部分。 當線程完成它等待所有其它線程完成(即,使用一個condition_variable
上的共享unique_lock
)和最后線程完成,加載數據的下一個塊從文件到陣列,直到整個文件是繼續該過程讀。 並行讀取的原因是這些文件通常超過1 GB
並且非常耗時。 這樣做的速度提高了約6x
或更多。
我觀察到一些奇怪的行為。 當代碼在物理機器中運行時(即使它是遠程連接的),多線程文件讀取始終正常工作。 但是,如果它在虛擬機上運行,有時在讀取后會丟失數據。 我已調試每個線程只讀一行,有時結果不正確。 這表明錯誤結果的原因不是讀取錯誤,而是缺少輸入文件中的整行( .txt
)。 如果我增加線程數(線程數越多,失敗次數越多)並增加文件大小(即,如果文件大小大於char* array
的大小),我可以更頻繁地重現錯誤結果。 這讓我相信問題不在於多線程文件讀取,而是與運行時環境(物理與虛擬機)有關。
我只是大聲思考,想看看是否有人經歷過類似的行為,或者是否有任何見解,為什么會出現這種行為。 我正在調查任何buffer overflow
問題,但到目前為止沒有發現任何問題。
編輯: 添加有關環境的更多信息
我正在使用Visual Studios 2013
因此使用MS Visual C++
編譯器,所有物理和虛擬機都是Windows Server 2012 R2
或帶有64-bit
和x64-based processors
Windows Server 2008 R2
最小可用內存為32GB
,可以升級到120GB
。 服務器使用不同版本的Intel Xeon E5
CPU。
它幾乎肯定意味着您的代碼具有競爭條件,該條件通常很少發生,但是由VM上的條件引出。
由於間歇可用的核心或不同的時間切片或者甚至從相對自願的更改到更強的任務切換,可能不同的線程調度正在強調該問題。 也有可能你錯過了某處的錯誤檢查,也許線讀取功能有時會因為可恢復的IO錯誤而讀取部分行,這些錯誤你沒有檢查但很少發生在真正的鐵上。 但是,由於您尚未發布代碼,因此我無法開始調試它。
TLDR幾乎可以肯定您的代碼是錯誤的,而不是VM實現(假設它是主流的虛擬機管理程序)。
作為一個側面點,盡管這與您的問題無關,但我不明白為什么您可能以這種方式執行此文件IO而不是mmap'ing文件並讓線程從mmap讀取。 在大多數情況下,這將大大提高效率,並且在大多數操作系統上本質上是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.