互斥锁解决哲学家就餐问题

#include
#include
#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINK_TIME 3
#define EAT_TIME 2
enum { THINKING, HUNGRY, EATING } state[N];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void test(int i)
{
if (state[i] == HUNGRY
&& state[LEFT] != EATING
&& state[RIGHT] !=EATING)
{
state[i] = EATING;
}
}
void take_forks(int i)
{
pthread_mutex_lock(&mutex);
state[i] = HUNGRY;
printf("%d hungry!\n",i);
test(i);
printf("%d take fork!\n",i);
pthread_mutex_unlock(&mutex);
}
void put_forks(int i)
{
pthread_mutex_lock(&mutex);
printf("%d put fork!\n",i);
state[i] = THINKING;
pthread_mutex_unlock(&mutex);
}
void think(int i)
{
//pthread_mutex_lock(&mutex);
printf("philosopher %d is thinking...\n", i);
sleep(THINK_TIME);
//pthread_mutex_unlock(&mutex);
}
void eat(int i)
{
pthread_mutex_lock(&mutex);
printf("philosopher %d is eating...\n", i);
sleep(EAT_TIME);
pthread_mutex_unlock(&mutex);
}
void* phi(void* vargp)
{
int i = *(int*)vargp;
while (1)
{
think(i);
take_forks(i);
eat(i);
put_forks(i);
}
return NULL;
}
int main()
{
int i;
pthread_t tid[N];
for (i = 0; i < N; i++)
{
pthread_create(&tid[i], NULL, phi, (void*)(&i));
sleep(1);
}
for (i = 0; i < N; i++)
pthread_join(tid[i], NULL);
return 0;
}

相关文档
最新文档