問題タブ [dining-philosopher]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - Go での食事の哲学者の問題が単体テストに失敗する
私は次のような課題を持つ囲碁コースを取っています:
次の制約/変更を加えて、食事の哲学者の問題を実装します。
箸を共有する 5 人の哲学者がいて、隣接する哲学者の各ペアの間に 1 つの箸が必要です。
各哲学者は 3 回だけ食べる必要があります (講義で行ったような無限ループではありません)。
哲学者は、番号の小さいものからではなく、任意の順序で箸を手に取ります (これは講義で行いました)。
食べるために、哲学者は独自のゴルーチンで実行するホストから許可を得る必要があります。
ホストは、2 人を超える哲学者が同時に食事をすることを許可しません。
各哲学者には、1 から 5 までの番号が付けられています。
哲学者が (必要なロックを取得した後に) 食べ始めると、行に "starting to eat" と表示されます。ここに哲学者の番号が表示されます。
哲学者が (ロックを解除する前に) 食事を終えると、"finning eat" と 1 行に表示されます。どこに哲学者の番号がありますか。
私の実装:
単体テスト:
問題は、テストがランダムに失敗することです。以下は1つの実行です(行番号が追加されています):
Philosopher 4 は 10 行目と 24 行目で開始し、11 行目、18 行目、28 行目で終了しています。28 行目は一致しないため、テストは正しくエラーを出します。ただし、バグを見つけるのに苦労しています。手伝ってくれますか?
c - sem_t 値がゼロの場合でも sem_wait() 関数ブロックを実行しないのはなぜですか?
私はダイニング哲学者問題 (5 人の哲学者) の簡単な解決策を実装しようとしていますが、私の解決策は次のロジックに基づいています。
各哲学者は最初に 3 秒以内に考える
次に、右の箸が利用できる場合は哲学者がそれを取り、左の箸も利用可能な場合は哲学者もそれを取り、3 秒以内に食べ始めます。
次に哲学者は箸を置き、他の哲学者が使えるようにします。
循環的な待機を避けるために、最後の哲学者の場合、最初に左の箸を選び、次に右の箸を選び、同じプロセスに進みます
このロジックに基づいて実装したコードは次のとおりです。
しかし、このコードのデバッグ中に問題が発生しましchopstick[i]
た。0
以前sem_wait(&chopstick[num])
は現在のスレッドをブロックする代わりに、箸がsem_wait()
持ち運べるようになるまで、哲学者は実際の箸なしで食事を始めました。
私の問題がどこにあるかを理解するのを手伝ってくれる人はいますか?