当前位置: 首页 > 知识库问答 >
问题:

在用餐哲学家上使用Pthread显示死锁

邓丰
2023-03-14

我们有一个任务来说明这个问题的僵局。我们已经编写了所有代码,并且代码可以编译,但是当运行代码时,一位哲学家最终吃了东西。所以这不意味着死锁实际上不会发生吗?

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

#define number_philo 5


pthread_mutex_t cutlery[number_philo];


void* philosopher (void* number)

{

    int my_num = *((int*)number);

    while (1)

    {


        printf("\n Philosopher %d is thinking.\n",my_num);


        pthread_mutex_lock (&cutlery[my_num]);
        printf("\nPhilosopher %d has left cutlery. \n",my_num);
        sleep(3);
        pthread_mutex_lock (&cutlery[(my_num + 1) %  number_philo]);
        printf("\nPhilosopher %d has right cutlery. \n",my_num);



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


        printf("\n Philosopher %d done.\n", my_num);


        pthread_mutex_unlock (&cutlery[(my_num + 1) % number_philo]);

        pthread_mutex_unlock (&cutlery[my_num]);
        printf("\nPhilosopher %d no longer has cutlery.\n", my_num);
    }

    return NULL;

}


int main ()

{

    int i;

    pthread_t phils[number_philo];

    void* return_val;


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

        pthread_mutex_init (&cutlery[i], NULL);


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

        pthread_create (&phils[i], NULL, philosopher, &i);


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

        pthread_join (phils[i], &return_val);


    return 0;

}

这就是输出:输出

共有1个答案

曾航
2023-03-14

问题在于:

  pthread_create (&phils[i], NULL, philosopher, &i);

您正在向每个线程传递一个指向相同变量i的指针,这些线程(和主线程)都在以一种活泼的方式访问i。你会得到多个哲学家使用相同的数字和一些根本没有使用的数字。

在循环并更改i之前,您需要为每个哲学家指定自己的变量来读取,或者等待它读取i。前者的一个例子是:

int phil_num[number_philo];

/* ... */

for (i = 0; i < number_philo; i++)
{
    phil_num[i] = i;
    pthread_create (&phils[i], NULL, philosopher, &phil_num[i]);
}
 类似资料:
  • 今天,我决定尝试解决哲学家吃饭的问题。所以我写下面的代码。但我认为这是不正确的,所以如果有人告诉我这是怎么回事,我会很高兴的。我使用fork作为锁(我只读取它们,因为我不把对它们的访问放在同步块中),我有一个扩展线程的类,它保留了它的两个锁。 我认为有些不对劲,因为第五位哲学家从不吃饭,第四位和第三位哲学家大多吃饭。提前感谢。

  • 我必须用信号量来解决这个问题。在我的代码中,每一个哲学家都在拿一根筷子,其他人都在等待。 我在主函数中仍然有一些错误。你能告诉我怎么使用筷子吗?我是BACI的初学者。

  • 我的Java代码中有一个问题,它应该模拟pholosophers问题,如下所述:http://en.wikipedia.org/wiki/Dining_philosophers_problem我想输出所有哲学家的当前状态,每次他们中的一个吃饭或思考。输出应该是这样的:“OxOx(2)”,其中“X”表示哲学家在吃,“O”表示他在思考,“O”表示他在等筷子。括号中的数字表示状态已更改的哲学家的编号。我

  • 这是Geeksforgeeks使用信号量解决用餐哲学家问题的方法: https://www.geeksforgeeks.org/dining-philosopher-problem-using-semaphores/ 这个代码死锁活锁和饥饿的概率很低,我想改变它,它将有死锁,活锁或饥饿的概率很高,我怎么做? 此外,我如何确保这个解决方案不会有任何这些问题100%(如果可能的话)

  • 我想用java信号量解决用餐哲学家的问题,但我被卡住了。最高ID的筷子应该是可用的,但它似乎总是采取,我不知道为什么。谁能告诉我我错在哪里了? Fork类: 哲学家班: 主要内容:

  • 本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮