簡単に並列化できる単純なタスクがあります。基本的に、同じ操作を(大きな数Gbの)入力ファイルの各行で繰り返し実行する必要があります。これのマルチスレッドバージョンを作成しているときに、I/Oがボトルネックであることに気付きました。私は、循環バッファにできるだけ速く進んで直接読み取る単一の「ファイルリーダー」スレッドを含むユーティリティクラスを構築することにしました。次に、複数のコンシューマーがこのクラスを呼び出して、「次の行」を取得できます。n個のスレッドが与えられた場合、各スレッドiの開始行はファイル内の行iであり、そのスレッドの後続の各行はnを追加することによって検出されます。これにはロックは必要ないことがわかりました。不変条件を保持するには、いくつかの主要なアトミック操作で十分です。
私はコードをテストしました、そしてそれはより速いようです、しかし考え直して、私は理由がわかりません。大きなファイルをn個の入力ファイルに分割し(同じファイルを「シーク」して同じことを実現し、前処理を最小限に抑えることができます)、各プロセスでiostream::readLineを呼び出すのも同じくらい速いのではないでしょうか。独自のチャンク?(iostreamは独自のバッファーにも読み込むため)。ワーカーは実際には同じデータ行を操作していないため、複数のスレッド間で単一のバッファーを共有することには固有の利点はないようです。さらに、同じ行で機能するように並列化することを考えない良い方法はありません。私は自分が見ているパフォーマンスの向上を理解し、それが「フルーキー」なのか、プラットフォーム間でスケーラブル/再現可能なのかを知りたいだけです...