5

「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ターン目)。

ご入力いただきありがとうございます。

4

1 に答える 1

4

1つのスレッドがバリアを数回通過する可能性がありますが、他のスレッドはまったく実行されません。

于 2011-02-19T09:23:43.527 に答える