「TheLittleBookOf Semaphores」(ここにアーカイブ)から、再利用可能なバリアアルゴリズムを調べています。
パズルは31ページ(基本的な同期パターン/再利用可能なバリア)にあり、本のソリューション(2フェーズバリア)とは異なる「ソリューション」(またはそうでない)を考え出しました。
これは、各スレッドの「コード」です。
# n = 4; threads running
# semaphore = n max., initialized to 0
# mutex, unowned.
start:
mutex.wait()
counter = counter + 1
if counter = n:
semaphore.signal(4) # add 4 at once
counter = 0
mutex.release()
semaphore.wait()
# critical section
semaphore.release()
goto start
これは機能しているようです。スレッドのさまざまなセクションにさまざまなスリープタイマーを挿入しましたが、すべてのスレッドが来るのを待ってから、すべてのループを続行します。私は何かが足りないのですか?これが失敗する条件はありますか?
これは、WindowsライブラリのSemaphore関数とMutex関数を使用して実装しました。
アップデート:
答えてくれたstarblueに感謝します。なんらかの理由でスレッドが遅くなり、完全なループの後に到着するスレッドは、未使用の信号の1つが残っているため、再び通過できることがわかります。mutex.release()
semaphore.wait()
semaphore.wait()
N
そしてSleep
、スレッド番号3のコマンドを入力すると、スレッド3が最初にターンを逃したことがわかります。スレッド1は2ターンを実行し、次に2番目のターンに追いつきます(実際には1ターン目)。
ご入力いただきありがとうございます。