これは概念的な質問です。私が働いているレガシーコードには、並列ファイルの読み込みをエミュレートするC++スレッド実装があります。マルチスレッドファイルの読み込み方法は、ファイルからchar* array
までのデータブロック(2^20 bytes
と言う)をストリーミングして、この配列の専用セクションを読み取る複数のスレッドになります。スレッドが完了すると、他のすべてのスレッドが完了するのを待ちます(unique_lock
で共有されたcondition_variable
を使用)。最後のスレッドを完了し、ファイルから次のブロックのデータを配列にロードし、ファイル全体が読む。並列読み込みの理由は、これらのファイルが1 GB
以上であり、それ以外の時間がかかることが多いからです。スピードアップは約6x
以上です。仮想マシン上で実行されるC++マルチスレッドファイルの読み込み
私はいくつかの奇妙な動作を観察しました。物理的なマシンでコードが実行されている場合(リモート接続されている場合でも)、マルチスレッドファイルの読み取りは常に正しく動作します。ただし、仮想マシン上で実行されている場合、読み取り後にデータが失われることがあります。私は各スレッドが1行しか読んでいない状態でデバッグしましたが、結果が間違っていることがあります。これは、間違った結果が読み取られたのではなく、入力ファイル(a .txt
)から行全体が欠落していないことを示しています。スレッド数を増やす(スレッド数が増えるほど頻繁に失敗する)、ファイルサイズを大きくする(つまり、ファイルサイズがchar* array
のサイズより大きい場合)、エラーの結果をより頻繁に再現できます。これは、問題がマルチスレッドファイルの読み込みではなく、実行時環境(物理マシンと仮想マシン)との関係であると考えています。
私は大声で考えてみて、誰かが似たような行動を経験しているのか、そのような行動が起こるのかについての洞察を見たいと思っています。私はbuffer overflow
の問題を調査していますが、これまで何も見つかりませんでした。
EDIT:は、私はVisual Studios 2013
はそうMS Visual C++
コンパイラを利用し、すべての物理マシンと仮想マシンが利用可能64-bit
とx64-based processors
最小メモリが32GB
あるとWindows Server 2012 R2
またはWindows Server 2008 R2
をしている使用している環境
に関するより多くの情報を追加します上昇して120GB
になる可能性があります。サーバーは異なるバージョンのIntel Xeon E5
CPUを使用します。
ちょっとしたコードを再現することは可能ですか?さらに、より多くの文脈が答えに役立つはずです。どのプラットフォームが物理マシンですか?バーチャルはどうですか?どのようにコンパイルしますか? 2つの環境の違いをより詳しく説明してください。 –
@BiagioFestaコメントありがとうございます。詳細をいくつか追加しましたが、レガシーコードは他の多くの関数と相互依存しており、正確なスニペットを再現することは困難です。 – kishansudu