問題タブ [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.
c++ - pthread_cond_wait の奇妙な動作
C++ を使用してダイニング哲学者の問題を解決しようとしています。
コードは でコンパイルされg++ -lpthread
ます。
全体のソリューションは哲学者の githubにあります。リポジトリには、main.cpp と philosopher.cpp の 2 つの cpp ファイルが含まれています。「Main.cpp」は、ミューテックス変数、セマフォ、5 つの条件変数、5 つのフォークを作成し、哲学者を開始します。セマフォは、哲学者の開始を同期するためにのみ使用されます。他のパラメーターは、問題を解決するために哲学者に渡されます。「Philosopher.cpp」には、特定の問題の解決策が含まれていますが、数ステップ後にデッドロックが発生します。
デッドロックは、哲学者 0 が食事をしていて、哲学者 1 (彼の隣) がフォークを取りたいときに発生します。次に、哲学者 1 はミューテックスを取得し、哲学者 0 がフォークを下ろすまでそれを返しません。哲学者 0 は、ミューテックスを取得したためにフォークを下に置くことができないため、デッドロックが発生します。問題はPhilosopher::take_fork メソッドにあり、 pthread_cond_wait(a,b) の呼び出しがミューテックス b を解放していません。理由がわからない?
残りはこのコードを参照してください。
algorithm - 哲学者の夕食への指揮者の解決策
前述の哲学者ディナー問題の導線解法は、サイズ 4 のセフォアを使用し、すべての哲学者が右分岐の前に左分岐を取得しようとすることを示唆しています。 http://en.wikipedia.org/wiki/Dining_philosophers_problem#Conductor_solution
左フォークにアクセスする全員と右フォークにアクセスする全員にセマフォを使用する必要がありますか?
哲学者が指定された時間内に左フォークを取得できるが、右フォークを取得できない場合、哲学者は何をすべきか? 彼らは左フォークを返すべきですか?
哲学者がフォークを返す順序は重要ですか?
確かに、この解決策は依然として飢餓につながる可能性があります. たとえば、Wiki では、A と C の両方に 2 つのフォークがあると書かれています。これは、セマフォがこれ以上フォークしないことを意味し、5 番目にハングアップします。D と E の間のフォークは、テーブルの上に置いておく必要があります。次に、A が右のフォークを返すとします。
これでセマフォは 3 に戻ります。
D は左のフォークをもう一度試すことができますが、右に曲がれないことに気付きます。Bは左にしか行けません。また駄目。
そして、A はすでに左のフォークを持っているので、もう一度右のフォークを選択しようとする可能性があります。これは、私たちがぐるぐる回っていることを意味します。
何かが足りない
ヘルプ?
multithreading - 哲学者の夕食会の指揮者解法において、左/右の順序が重要なのはなぜですか?
前述の哲学者ディナー問題の導線解法は、サイズ 4 のセフォアを使用し、すべての哲学者が右分岐の前に左分岐を取得しようとすることを示唆しています。http://en.wikipedia.org/wiki/Dining_philosophers_problem#Conductor_solution
また、哲学者は左/右の順序でフォークを拾うことを示唆していますか?
哲学者が左/右の順序でフォークを拾うことが重要なのはなぜですか?
または、すべて同じ順序で (すべて右/左も可能だと思います)?
algorithm - 哲学者の夕食のフォークは固定された場所にありますか?
哲学者の夕食会は、古典的な並行性の問題です。こちらの説明を参照してください。Conductors ソリューションでは、フォークが特定の場所に戻されるか、単に一般的なヒープに置かれます。では、どの哲学者の左フォークも同じ左フォークになるのでしょうか? それとも、夕方が進むにつれて別のフォークになる可能性がありますか?
java - 食事の哲学者 - 最後のスレッドが正しく終了しない
この食事の哲学者のコードを書きましたが、最後のスレッドで目的の「xxx が夕食を終えました」という行が生成されませんか? 私は何を間違えましたか?
最後のスレッドが途中で終了したようです。
これについて何か助けていただければ幸いです。
java - Java Philosopher ダイナー
私は哲学者の食事のタスクに取り組んでいますが、問題があります。私のコードは、フォーク、哲学者、dinerTable の 3 つのクラスを中心に展開しています (はい、最後の 2 つを誤って小文字で名前を付けました)。
コードは適切に開始され、哲学者 0 と 2 はフォークをつかみますが、その後コードは停止します。誰か助けてもらえますか?
3 つのクラスがあります。
フォーク (スレッドを拡張) :
哲学者 (Runnable を実装) :
ダイナーテーブル:
java - ジャワダイニング哲学者モニター
ここで説明されている食事の哲学者の問題をシミュレートする必要がある Java コードに問題があります: http://en.wikipedia.org/wiki/Dining_philosophers_problemと思います。出力は「OXO o X (2)」のようになります。ここで、「X」は哲学者が食べることを意味し、「O」は哲学者が考えていることを意味し、「o」は箸を待っていることを意味します。括弧内の数字は、状態が変化した哲学者の番号を示します。私が抱えている問題は、哲学者 1 と 3 (場合によっては 2 と 4) だけが食べ、他の人は常にフォークを考えたり待ったりし、それが絶えず繰り返されるため、出力は次のようになります。
オックスオー (2)
o X o XO (4)
o O o X o (2)
o O o O o (4)
o X o O o (2)
o X o X o (4)
o O o X o (2)
...
完全なコードは次のとおりです。
Java で哲学者を食事することについて、すでにいくつかの質問があることは知っていますが、どれも役に立たないようで、私のコードは少し異なります。ありがとう。
c# - メイン C# からスレッドがデッドロック状態にあるときを判断する方法
デッドロックの検出とデッドロックの回避のためのツールに関する他の投稿を読みました。しかし、私の質問は、スレッドがメインからデッドロック状態にあるときを特定して、スレッドがデッドロックされるまでメインスレッドをスリープ状態にしてさらに先に進む方法についてです。
ThreadState.WaitSleepJoin を使用して、Main ですべてのスレッドが長時間デッドロックされているかどうかを検出しようとしましたが、うまくいかないようです。すべてのスレッドがいつデッドロックされたかを判断するためのユーティリティ メソッドはありますか?
すべてのスレッドが右または左の箸を最初に取ると、他の箸を永遠に待つため、デッドロックが発生します。唯一の問題は、これらすべてのスレッドがメインから永遠に待機状態になる時期を見つけることができないことです。
これは私の Run メソッドです:
これはメインです:
WaitSleepJoin を効率的なソリューションに置き換えて、すべてのスレッドがいつデッドロックされたかを調べるにはどうすればよいですか?
助けてください、どんな提案でも大歓迎です!ありがとう!
c - fork() を使用して C で哲学者を食事する
しばらく前に pthread を使用してダイニング哲学者問題の C プログラムを作成しましたが、現在、代わりに fork() を使用するように変更しようとしています。これは、私がすでに合格した講義の練習問題です。しかし、友人に助けを求められたのですが、自分では理解できないようで、気が狂いそうです!
「ps」を実行すると、プロセスがそこにあります。しかし、stdout への出力がないので、パイプに何か問題があると思います。
よろしくお願いします。