gpt4 book ai didi

c - 使用 pthreads 的简单用餐哲学家

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:46 24 4
gpt4 key购买 nike

我正在从事餐饮哲学家项目。但是我遇到了一个问题,我的程序在所有哲学家都吃完之前就停止了,我不明白为什么。这是我现在的代码:

#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);
}

最佳答案

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

尽管如此,您需要将 for() 语句从:

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

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

在任何情况下,问题代码中都有一些 - 可能 - 需要更改的内容。 (对答案不重要):

  • 虽然“func()”被声明为返回“void *”,但实际上并没有。
  • 函数原型(prototype)'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;
}

关于c - 使用 pthreads 的简单用餐哲学家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com