1

私はマルチスレッド システムにまったく慣れていないので、オブジェクトの適切なデータ構造について質問があります。

いくつかの属性を持つオブジェクト イメージがあります。そのうちの 2 つは、イメージ データを格納するバイト配列データと、ステータスを格納する int 変数 status です。

私はある種のコンベヤ ベルト アーキテクチャを持っています。つまり、カメラ スレッドがデータを画像属性に格納し、その後にコンバータ スレッドが続き、その後に処理スレッドが続きます。したがって、1 つのスレッドが先行スレッドの出力を処理する必要があります。

同期を避けて効率を上げるために、私の考えは、LinkedList<Image>画像オブジェクトを保存することです。webcam-thread は最初の画像オブジェクトを作成し、status=1 (進行中のデータ書き込みを意味する) を割り当て、終了して次の画像に進む場合は status=2 を割り当てます。次のコンバーター スレッドはステータス属性のみを読み取ります。1 の場合はスリープまたは待機します (Webcam スレッドによって通知可能)、2 の場合はステータス 3 を割り当てて作業を開始します。終了すると status=4 に設定され、次の画像オブジェクトに進みます。次のスレッドは再びステータスを読み取り、ステータスが 4 未満の場合はスリープします。

最後に私の質問は、1 つだけが書き込み操作であり、もう 1 つの (読み取り) アクセスが別の属性/変数 (同じ物体)。

4

1 に答える 1

1

1 つのスレッドが同じ共有データを変更し、他のスレッドが読み取りのみを実行する場合でも、競合やデータ破損が発生する可能性があります。

次の点を考慮してください。

                                   Thread 1                       | Thread 2
                                   ...                            | ...  
--> not atomic!                    start writing shared resource  | ...
--> data state is undefined here   ...                            | read shared resource
                                   end writing shared resource    | ...

同じ共有データへの書き込みアクセスが追加のアクセス (読み取りまたは書き込み) なしで発生することを保証できる場合は、保護なしで問題ありません。

semaphoreそれ以外の場合は、やなどのロック メカニズムを使用して共有リソースを保護する必要がありますmutex。説明からすると、典型的なconsumer-producer問題のように思えます。プロデューサー、コンシューマー、およびプロデューサー キューの同期と同様の質問を見てください。

于 2012-11-29T14:14:43.240 に答える