我正在尝试使用 C++解决餐饮哲学家的问题。
代码用g++ -lpthread
.
整个解决方案在哲学家 github 上。Repository 包含两个 cpp 文件:main.cpp 和philosopher.cpp。“Main.cpp”创建互斥变量、信号量、5 个条件变量、5 个分叉,并启动哲学家。信号量仅用于同步哲学家的启动。其他参数被传递给哲学家来解决问题。“Philosopher.cpp”包含给定问题的解决方案,但经过几步就会发生死锁。
当哲学家 0 正在吃饭,而哲学家 1(在他旁边)想拿叉子时,就会发生死锁。然后,哲学家 1 拿走了互斥锁,直到哲学家 0 放下他的叉子才把它还给它。由于采取了互斥锁,哲学家 0 不能放下他的叉子,所以我们陷入了僵局。问题出在Philosopher::take_fork 方法中,调用 pthread_cond_wait(a,b) 没有释放 mutex 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);
}
其余的请参考此代码。