あなたの要件によると、次の 2 つの原則を使用できると思います。
shared_array<char>
マルチスレッド同期とメモリ処理を処理します
- モジュールごとに 1 つのキュー: 各モジュールが独自のペースで画像を処理するため、これが必要です。
次に、画像を取得したらすぐに、.a のヒープに割り当てますshared_array<char>
。このポインターは、すべてのキューで複製されます。
各キューは個別に同期を必要としますが、これは従来のコンシューマ/プロデューサーのことですが、特に各キューには 1 つのプロデューサー (イメージを受信するスレッド) と 1 つのコンシューマーしかないため、おそらく (かなり) 簡単にプログラムできます。
例を見てみましょう: 3 つのモジュールを取り上げましょう。
=> receiving image 1
module a: ['1'] -> processing (none)
module b: ['1'] -> processing (none)
module c: ['1'] -> processing (none)
=> modules a, b starts treatment of '1'
module a: [] -> processing '1'
module b: [] -> processing '1'
module c: ['1'] -> processing (none)
=> receiving image 2
module a: ['2'] -> processing '1'
module b: ['2'] -> processing '1'
module c: ['2', '1'] -> processing (none)
=> module a finishes treatment of '1', starts treatment of '2'
module a: [] -> processing '2'
module b: ['2'] -> processing '1'
module c: ['2', '1'] -> processing (none)
=> receiving image 3
module a: ['3'] -> processing '2'
module b: ['3', '2'] -> processing '1'
module c: ['3', '2', '1'] -> processing (none)
=> module c starts treatment of '1', '2' and '3'
module a: ['3'] -> processing '2'
module b: ['3', '2'] -> processing '1'
module c: [] -> processing '1', '2' and '3'
=> module a finishes treatment of '2', starts treatment of '3'
=> module b finishes treatment of '1', starts treatment of '2'
=> module c finishes treatment of '1' and '2', keeps '3' for future batch
module a: [] -> processing '3'
module b: ['3'] -> processing '2'
module c: [] -> processing '3' (waiting)
--> at this point '1' is deleted from memory
各モジュール (スレッド) がそのキューを「プール」に登録すると、これを「簡単」にすることもできます。
シグナリングもお勧めします。コンシューマ スレッドが常にキューをポーリングしているということで、(キューが空の場合) 新しいアイテムが挿入されたことをプロデューサがシグナリングする方が良いと常に思います...