以Udacity操作系统课程为乐 - Mutexes

时间:2018-03-31 18:14:44

标签: c mutex

我正在努力完成Udacity的任务,以便利用我的业余时间来提高自己。我对这项任务感到有点困惑,因为它与互斥体和餐饮哲学家的问题有关(这个问题表明有5个哲学家有5个叉子,如果一个哲学家在吃饭并使用邻居的叉子,那么邻居本身就不能吃)。我没有按照任务做正确的事情:

例如,如果哲学家0正在进食,那么当哲学家0正在进食时,哲学家2或者3可以同时进食,但是1和4都不能同时进食,因为哲学家使用了叉子0 。

我得到以下输出:

Philosopher 1 is thinking
Philosopher 1 is eating
Philosopher 0 is thinking
Philosopher 3 is thinking
Philosopher 4 is thinking
Philosopher 3 is eating
Philosopher 2 is thinking
Philosopher 1 finished eating
Philosopher 0 is eating
Philosopher 3 finished eating
Philosopher 2 is eating
Philosopher 0 finished eating
Philosopher 2 finished eating
Philosopher 4 is eating
Philosopher 4 finished eating

这来自以下代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

pthread_t philosopher[5];
pthread_mutex_t philosopherForks[5];

void *diningPhilosopher(int n) {

   printf ("Philosopher %d is thinking\n",n);
   pthread_mutex_lock(&philosopherForks[n]);
   pthread_mutex_lock(&philosopherForks[(n+1)%5]);
   printf ("Philosopher %d is eating\n",n);
   sleep(3);
   pthread_mutex_unlock(&philosopherForks[n]);
   pthread_mutex_unlock(&philosopherForks[(n+1)%5]);

   return(NULL);

}

int main() {
   int i;
   for(i=0;i<5;i++)
      pthread_mutex_init(&philosopherForks[i],NULL);

   for(i=0;i<5;i++)
      pthread_create(&philosopher[i],NULL,(void *)diningPhilosopher,(void *)i);

   for(i=0;i<5;i++)
      pthread_join(philosopher[i],NULL);

   for(i=0;i<5;i++)
      pthread_mutex_destroy(&philosopherForks[i]);



return 0;
}

0 个答案:

没有答案
相关问题