【发布时间】:2014-05-08 00:38:32
【问题描述】:
我正在从事哲学家进餐计划。但是我遇到了一个问题,我的程序在所有哲学家都吃完之前就停止了,我不明白为什么。这是我现在的代码:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void *func(int n);
pthread_t philosopher[5];
pthread_mutex_t chopstick[5];
int main()
{
int i;
void *msg;
for(i=1;i<=5;i++)
{
pthread_mutex_init(&chopstick[i],NULL);
}
for(i=1;i<=5;i++)
{
pthread_create(&philosopher[i],NULL,(void *)func,(int *)i);
}
for(i=1;i<=5;i++)
{
pthread_join(philosopher[i],&msg);
}
for(i=1;i<=5;i++)
{
pthread_mutex_destroy(&chopstick[i]);
}
return 0;
}
void *func(int n)
{
printf ("\nPhilosopher %d is thinking ",n);
pthread_mutex_lock(&chopstick[n]);//when philosopher 5 is eating he takes fork 1 and fork 5
pthread_mutex_lock(&chopstick[(n+1)%5]);
printf ("\nPhilosopher %d is eating ",n);
sleep(3);
pthread_mutex_unlock(&chopstick[n]);
pthread_mutex_unlock(&chopstick[(n+1)%5]);
printf ("\nPhilosopher %d finished eating ",n);
}
【问题讨论】:
-
除此之外,哲学家需要按预先定义的顺序来抓筷子(例如,先抓起数量最多的筷子)。
-
“我的程序在所有哲学家都吃完之前就停止了”——这不正是你想观察到的哲学家的行为吗?
-
Dining Philosopher Program C 的可能重复项
标签: c pthreads dining-philosopher