当前位置:  技术问答>linux和unix

100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!

    来源: 互联网  发布时间:2015-08-07

    本文导语:  如题。 | 代码大致如下,当然不能直接使用,我没写P,V操作的函数。                   # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i的左邻号码 */ # define RIGHT (i+1)%N ...

如题。

|
代码大致如下,当然不能直接使用,我没写P,V操作的函数。         
         # define N 5 /* 哲学家数目 */
# define LEFT (i-1+N)%N /* i的左邻号码 */
# define RIGHT (i+1)%N /* i的右邻号码 */
# define THINKING 0 /* 哲学家正在思考 */
# define HUNGRY 1 /* 哲学家想取得叉子 */
# define EATING 2 /* 哲学家正在吃面 */

typedef int semaphore; /* 信号量是一个特殊的整型变量 */
int state[N]; /* 记录每个人状态的数组 */
semaphore mutex=1; /* 临界区互斥 */
semaphore s[N]; /* 每个哲学家一个信号量 */
  void take_forks(int i);
  void put_forks(int i);
  void test(int i);
  void eat();
void philosopher(int i) /* i:哲学家号码,从0到N-1 */
{
while(1)
{ /* 无限循环 */
think(); /* 哲学家正在思考 */
take_forks(i); 
/* 需要两只叉子,或者阻塞 */
eat(); /* 进餐 */ 
put_forks(i); 
/* 把两把叉子同时放回桌子 */
}
}

void take_forks(int i) /* i:哲学家号码从0到N-1 */

down(&mutex); /* 进入临界区 */
state[i]=HUNGRY; /* 记录下哲学家i饥饿的事实 */
test(i); /* 试图得到两只叉子 */
up(&mutex); /* 离开临界区 */
down(&s[i]); /* 如果得不到叉子就阻塞 */
}

void put_forks(int I) /* i:哲学家号码从0到N-1 */

down(&mutex); /* 进入临界区 */
state[i]=THINKING; /* 哲学家进餐结束 */
test(LEFT); /* 看一下左邻居现在是否能进餐 */
test(RIGHT); /* 看一下右邻居现在是否能进餐 */
up(&mutex); /* 离开临界区 */
}

void test(i) /* i:哲学家号码从0到N-1 */

if(state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING)
{
state[i]=EATING;
up(&s[i]);
}
}
  void think()
  {
   prinft("I am thinkingn");
  }
  int main()
{
    int i;
    for(i=0; i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 操作系统:哲学家吃饭问题.关于Linux/Unix.
  • 〖高分求解〗★★★★★【C或C++, 来模拟 5位 哲学家进餐的问题。】★★★★★〖up有分〗
  • ****用JAVA写了一个哲学家问题,但是运行的时候有异常,大家有时间的帮我看看******


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3