【问题标题】:Showing deadlock, using Pthreads, on Dining Philosophers在 Dining Philosophers 上使用 Pthread 显示死锁
【发布时间】:2017-03-02 16:05:13
【问题描述】:

我们有一个作业来展示哲学家就餐问题的僵局。我们已经编写了所有代码并且代码可以编译,但是在运行代码时,其中一位哲学家最终吃掉了。那么这是否意味着实际上不会发生死锁?

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

}

这是输出:output

【问题讨论】:

  • 几个小时前你没有问过类似的问题吗?
  • 相同的任务,不同的前提

标签: c pthreads posix dining-philosopher


【解决方案1】:

问题出在这里:

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

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多