3

「main」と「worker」の 2 つのスレッドと、while ループを終了するときにスレッドが通知bool isQuitRequestedするために使用される 1 つのグローバル変数があります (次のようなもの: ) 。mainworkerwhile(isQuitRequested == false) { ... do some stuff ... }

さて、私は少し心配しています... 1 つのスレッド ( ) だけが操作を実行し、もう 1 つのスレッド ( )はチェックのみを実行し、それ以外は何も実行しないことisQuitRequestedを考えると、何らかのミューテックス保護を に使用する必要がありますか?mainisQuitRequested = trueworker

2 つのスレッドが同じ bool 変数に同時にアクセスするとどうなるかを読みました。. 似たようなことはありますが、同じ状況ではありません...

4

4 に答える 4

4

使用している言語を指定していません。投稿した小さなコード スニペットから、C#、Java、または C++ のいずれかである可能性があります。それぞれのこの「パターン」の一般的な解決策を次に示します。

C#:

volatile bool isQuitRequested;

ジャワ:

volatile boolean isQuitRequested;

C++: volatilein C++ はほとんど役に立ちません。と一緒に行きます:

std::atomic<bool> isQuitRequested;
于 2012-02-15T10:38:38.710 に答える
3

volatileこれは、プロデューサースレッド(boolをtrueに設定する)の影響を受けるコンシューマー(boolをチェックする)スレッドでデータを使用していない限り、およびコンシューマースレッドがboolを検出した後、boolで安全である必要があります。 trueに設定されている場合、プロデューサースレッドと通信する方法として再利用/リセットを試みません(リンクする例のように)。

これは、その場合、メモリの並べ替えが問題にならないためです。

于 2012-02-15T08:15:40.613 に答える
1

Javaではvolatile、その変数を次のようにマークするだけで済みます。

volatile boolean isQuitRequested;

またはを使用しますAtomicBoolean。そうしないと、あるスレッドによって行われた変更が他のスレッドに表示されない場合があります。

ただし、あなたの場合、組み込みの機能があります。スレッドを呼び出して処理するだけです。 「を使用せずに永久に実行されているスレッドを停止する方法」をinterrupt()参照してください。

参照:

于 2012-02-15T08:16:38.363 に答える
0

Windowsでの私の経験によると、基本的なタイプであるchar、short、int、longのいずれかであれば、通常はグローバル変数で十分です。あなたがそれを「正しい方法」でやりたいのなら、@Tudorの解決策はうまく見えます。

于 2012-02-15T12:13:05.663 に答える