問題の新しい説明:
現在、新しいデータ取得ソフトウェアをテスト環境で実行しています。このソフトウェアには 2 つのメイン スレッドがあります。1 つには、ハードウェアと通信してデータをデュアル バッファにプッシュする高速ループが含まれています。数秒ごとに、このループは 200 ミリ秒フリーズします。いくつかのテストを行いましたが、ソフトウェアが何を待っているかを理解することはできませんでした。ソフトウェアはかなり複雑で、テスト環境もソフトウェアに干渉する可能性があるため、レコーダー スレッドが 200 ミリ秒ブロックされている間に何を待機しているかをテストするためのツール/手法が必要です。これを達成するには、どのツールが役立ちますか?
元の質問:
データ取得ソフトウェアには、主な機能を提供する 2 つのスレッドがあります。1 つのスレッドがさまざまなセンサーからデータを収集し、2 つ目のスレッドがデータを大きなブロックでディスクに保存します。データはダブル バッファに収集されます。通常、アイテムごとに 100000 バイトが含まれ、1 秒あたり最大 300 アイテムを収集します。1 つのバッファーはデータ収集スレッドでの書き込みに使用され、1 つのバッファーはデータの読み取りと 2 番目のスレッドでのディスクへの保存に使用されます。すべてのデータが読み取られると、バッファが切り替えられます。バッファの切り替えは、主要なパフォーマンスの問題のようです。バッファーが切り替わるたびに、データ収集スレッドが約 200 ミリ秒ブロックされますが、これは長すぎます。ただし、切り替えがはるかに高速で、ほとんど時間がかからない場合があります。(テスト PC: Windows 7 64 ビット、
私の推測では、パフォーマンスの問題はコア間で交換されるデータに関連しているということです。スレッドがたまたま同じコアで実行されている場合にのみ、交換ははるかに高速になります。両方のスレッドが同じコアで実行されるようにスレッド アフィニティ マスクを設定することを考えましたが、これは実際の並列処理が失われることも意味します。もう 1 つのアイデアは、切り替え前にバッファがより多くのデータを収集できるようにすることでしたが、新しいデータにアクセスする前にバッファが切り替わるのを待たなければならないため、データ表示の更新頻度が大幅に低下します。
私の質問は次のとおりです。収集スレッドを妨げずに、あるスレッドから別のスレッドにデータを移動する手法はありますか?
編集: ダブル バッファーは、リング バッファーとして使用される 2 つの std::vectors として実装されます。bool (int) 変数は、どのバッファがアクティブな書き込みバッファであるかを示すために使用されます。ダブル バッファがアクセスされるたびに、bool 値がチェックされ、どのベクトルを使用する必要があるかが判断されます。ダブル バッファーでバッファーを切り替えることは、この bool 値を切り替えることを意味します。もちろん、トグル中はすべての読み取りと書き込みがミューテックスによってブロックされます。このミューテックスが 200 ミリ秒ブロックしている可能性はないと思います。ところで、200 ミリ秒は各スイッチ イベントで非常に再現性があります。