【问题标题】:Simple dining philosopher using pthreads使用 pthread 的简单餐饮哲学家
【发布时间】: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


【解决方案1】:

我在我的 SLES 11 服务器上多次运行问题代码。我没有观察到问题中指出的问题。

不过,您需要将 for() 语句从以下位置更改:

for(i=1;i<=5;i++)

for(i=0;i<5;i++)

无论如何,问题代码中可能会更改一些内容。 (对答案没有任何关键性)

  • 虽然 'func()' 被声明为返回 'void *',但它没有。
  • 函数原型'void *func(int n);'如果将 'main()' 移到文件末尾,则可以消除。
  • 不必将'&msg' 传递给pthread_join()';可以传入“NULL”,从而完全消除“msg”。

这是我最终得到的代码:

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

pthread_t philosopher[5];
pthread_mutex_t chopstick[5];

void *func(int n)
   {
   printf ("Philosopher %d is thinking\n",n);

   //when philosopher 5 is eating he takes fork 1 and fork 5
   pthread_mutex_lock(&chopstick[n]);
   pthread_mutex_lock(&chopstick[(n+1)%5]);
   printf ("Philosopher %d is eating\n",n);
   sleep(3);
   pthread_mutex_unlock(&chopstick[n]);
   pthread_mutex_unlock(&chopstick[(n+1)%5]);

   printf ("Philosopher %d finished eating\n",n);

   return(NULL);
   }

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

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

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

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

   return 0;
   }

【讨论】:

  • 感谢您的建议。我对此有点陌生。 ://
  • @user3335367,问题代码做得很好。不要卖空自己。祝你好运!
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2019-02-07
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多