3

私は「The Little Book of Semaphores」を読んでいて、41 ページに Reusable Barrier 問題の解決策があります。私が抱えている問題は、デッドロック状況が発生しない理由です。

1 # rendezvous
2
3 mutex.wait()
4     count += 1
5     if count == n:
6         turnstile2.wait() # lock the second
7         turnstile.signal() # unlock the first
8 mutex.signal()
9
10 turnstile.wait() # first turnstile
11 turnstile.signal()
12
13 # critical point
14
15 mutex.wait()
16     count -= 1
17     if count == 0:
18         turnstile.wait() # lock the first
19         turnstile2.signal() # unlock the second
20 mutex.signal()
21
22 turnstile2.wait() # second turnstile
23 turnstile2.signal()

このソリューションでは、15 行目と 20 行目の間で、デッドロックを引き起こすミューテックスを保持している間にセマフォ (18 行目) で wait() を呼び出すのは悪い習慣ではありませんか? 説明してください。ありがとうございました。

4

1 に答える 1

4

mutex変数を保護しcountます。最初のミューテックスロックは、各スレッドを説明するためにカウンターをインクリメントすることに関係し、最後に入るスレッド(if count == n)は、離れる準備として2番目のタンスタイルをロックし(以下を参照)、待機中の(n-1)スレッドを解放します(待機中) 10行目)。次に、それぞれが次の信号を送ります。

2番目のミューテックスロックは最初のロックと同様に機能しますが、デクリメントしますcount(同じミューテキストがそれを保護します)。ミューテックスブロックに入る最後のスレッドturnstileは、次のバッチエントリの準備のためにロックし(上記を参照)、22行目で待機している(n-1)スレッドを解放します。次に、各スレッドは次のスレッドに信号を送ります。

したがって、臨界点への入口を調整turnstileし、臨界点turnstile2からの出口を調整します。

デッドロックは発生しない可能性があります。(最後の)スレッドが18行turnstile目に到達するまでに、他のスレッドによって保持されないことが保証されます(22行目ですべて待機しています)。同様にturnstile2

于 2012-04-16T05:11:10.867 に答える