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 を解放していません。理由がわからない?
// Taking fork. If eather lef or right fork is taken, wait.
void Philosopher::take_fork(){
pthread_mutex_lock(&mon);
std::cout << "Philosopher " << id << " is waiting on forks" << std::endl;
while(!fork[id] || !fork[(id + 1)%N])
pthread_cond_wait(cond + id, &mon);
fork[id] = fork[(id + 1)%N] = false;
std::cout << "Philosopher " << id << " is eating" << std::endl;
pthread_mutex_unlock(&mon);
}
残りはこのコードを参照してください。