2

たとえば、整数フラグでアトミック スピンロックを使用して、特定の時点でミューテックスが保持する待機キューを 1 つのスレッドのみが変更するようにするとします。スレッドがミューテックスをロックしようとするとき、それ自体をキューに入れ、フラグをゼロに設定してからそれ自体をブロックし、unlocker がスレッドをキューからデキューして実行可能に設定するようにします。

2 つのスレッドのみが存在すると考えてください。1 つは同時にミューテックスをロックし、もう 1 つはミューテックスを解放します。ロッカーが自分自身をキューに追加し、フラグをゼロに設定した後に横取りされた (ただし、まだブロックされていない) 場合、アンロック機能がデキューしてスレッドを実行可能にしようとした場合、スレッドが実行されていないため、役に立ちません。まだ自分自身をブロックしました。そのため、make-runnable 呼び出しは無駄になりますが、さらに重要なことは、その後ロッカー スレッドがそれ自体をブロックし、永久にブロックされたままになることです。

正確さを保証するために、この原子性はどのように達成されますか? 同様のシナリオは、ミューテックスの解放とそれ自体のブロックを伴う条件変数で想像できます。

4

0 に答える 0