0

食事の哲学者の問題でデッドロックを示す割り当てがあります。すべてをコーディングし、コードはコンパイルされますが、コードを実行すると、哲学者の 1 人が最終的に食べてしまいます。つまり、実際にはデッドロックは発生しないということではないでしょうか。

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

}

そして、これは出力です:出力

4

1 に答える 1

0

問題はここにあります:

  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]);
}
于 2016-10-21T00:06:09.563 に答える