【发布时间】:2018-10-08 18:43:38
【问题描述】:
我正在研究哲学家进餐问题,其中 n 位哲学家轮流思考和进餐。我想要一个这样的版本,哲学家将按照他们的 id 顺序吃饭:0,1,2,3,4...,但我的线程一直被阻塞。我的线程从调用PhilosopherThread() 开始。
void putDownChopsticks(int threadIndex){
//finished eating
pindex++;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
}
void pickUpChopsticks(int threadIndex){
pthread_mutex_lock(&lock);
while(pindex != threadIndex){
pthread_cond_wait(&cond, &lock);
}
//lets go eat
}
void eating(){
//put thread to sleep
}
void thinking(){
//put thread to sleep
}
void* PhilosopherThread(void *x){
int *index = x;
thinking(); //just puts thread to sleep to simulate thinking
pickUpChopsticks(*index);
eating(); //just puts thread to sleep to simulate eating
putDownChopsticks(*index);
return NULL;
}
我在整理哲学家时遇到了一些麻烦。在线程被阻塞之前,我只能让前 2 个线程吃掉。
编辑: 据我所知,我这样做是对的。我首先锁定互斥体,然后检查 pindex 是否是当前线程 id,如果不是,线程将等到 pindex 等于 id。然后线程可以去吃,一旦完成,我们增加 pindex,发出线程完成的信号,并解锁互斥锁。
【问题讨论】:
-
@jxh,在另一种方法中,我在一个循环中创建 n 个线程并为每个线程分配循环值:0,1,2,3...(我还确保它是正确的值)。
pindex不应该返回 0,而是应该循环遍历 id 值,从 0 开始到 1,然后是 2,3,4... 这就是我有pindex++的原因。 -
@jxh 我做了另一个版本,涉及在每根筷子上使用互斥锁。但是现在我想模拟一个他们按顺序吃饭的问题。这意味着通常哲学家 1 和 2 共用一根筷子,但现在这无关紧要,因为哲学家 2 在 1 吃完之前不能吃东西。
-
@jxh 我在第一个函数
putDownChopstick中有pthread_cond_signal,这样我可以在线程完成进食后发出信号。 -
“据我所知我做得对”,真的吗?据您所知,看起来更像是您的代码死锁。我们不知道,因为您没有提供完整的代码。
标签: c multithreading mutex condition-variable