0

場合によっては、別のスレッドがこのセクションにある間、コードの一部のセクションが1つのスレッドで使用されないようにする必要があります。マルチスレッドをサポートする言語を使用すると、これらの部分を「ロック」することで簡単に実現できます。しかし、スレッドを「シミュレート」する必要がある場合lock、C#のキーワードやLockJavaのインターフェイスのような組み込みのものはありません。これらの場合にセクションをロックするために私が見つけた最良の方法は、次のようになります。

if (!locked){
    locked = true;

    do some stuff

    locked = false;
} else {
    add to queue
}

現在のソリューションの欠点は何ですか?積極的に使う価値はありますか?

4

2 に答える 2

2

たぶん2つのスレッドがifステートメントに入ることができます。

説明

T1ステートメントに入力され、値ifを変更しない場合locked。突然、CPUが変更T1された場合T2locked値は継続しfalseます。その後、ステートメントにもT2入ります。if

T1 -> !locked   -> Stopped -> Waiting -> ... //locked value still false and T2
T2 ->  Waiting  ->  Waked  -> !locked -> ... //will be able to enter into if

セマフォミューテックスを確認する必要があります。2つのプロセスのみを使用する場合は、ピーターソンのアルゴリズムを使用できますが、それでも処理に忙しい待機があります。

于 2012-07-28T16:25:24.513 に答える
1

アンダーレイシステムまたはOSによって提供されるダブルチェックのロックおよび同期プリミティブ(ミューテックス、セマフォ、モチノアなど)を見てください。C++にもキーワードがないことに驚かれることでしょうが、Lockすべて問題ありません。C#はモニターlockを使用して実装されており、詳細についてはこちらをご覧ください。

于 2012-07-28T16:40:11.350 に答える