【Linux】哲学家就餐问题

问题描述

【Linux】哲学家就餐问题_第1张图片

程序分析

1.5个哲学家相当于5的线程,5支筷子相当于5把mutex锁。
2.一共五支筷子,最多同时两个人吃饭。
3.将五个哲学家命名为ABCDE,并列出每个需用左右筷子号。
4.若拿起左边的筷子,则将对应筷子号码上锁,然后判断其右手是否有筷子, 若有,则可吃饭,否则,放下左手筷子,即解锁。
5.吃完饭需放下筷子,即进行解锁。
6.主函数中初始化五把锁,并且将创建五个进程。

代码实现

#include
#include
#include
#include
#include

pthread_mutex_t chopsticks[6];
void *et(void *arg)
{
    char phi = *(char *)arg;
    int left,right;
    switch (phi)
    {
        case 'A':
        left = 1;
        right = 5;
        break;
        case 'B':
        left = 2;
        right = 1;
        break;
        case 'C':
        left = 3;
        right = 2;
        break;
         case 'D':
        left = 4;
        right = 3;
        break;
         case 'E':
        left = 5;
        right = 4;
        break;
    }
 
    while(1)
    {
            //思考
            sleep(3);
            pthread_mutex_lock(&chopsticks[left]);
            printf("Philosopher %c pick up chopsitick %d.\n",phi,left);
            int ret = pthread_mutex_trylock(&chopsticks[right]);
            if(ret != 0)
            {
                pthread_mutex_unlock(&chopsticks[left]);
                continue;
            }
            //拿到筷子
            printf("Philosopher %c pick up chopsitick %d.\n",phi,right);
            //吃饭
            printf("Philosopher %c eating.\n",phi);
            //吃饭时间
            sleep(3);
            pthread_mutex_unlock(&chopsticks[left]);
            printf("Philosopher %c lay down chopstick %d.\n",phi,left);
            pthread_mutex_unlock(&chopsticks[right]);
            printf("Philosopher %c lay down chopstick %d.\n",phi,right);
    }
}
int main()
{
    pthread_t A,B,C,D,E;
    //初始化五把锁
    for(int i = 1;i < 6;i++)
    {
        pthread_mutex_init(&chopsticks[i],NULL);
    }
    //创建五个进程
    pthread_create(&A,NULL,et,"A");
    pthread_create(&B,NULL,et,"B");
    pthread_create(&C,NULL,et,"C");
    pthread_create(&D,NULL,et,"D");
    pthread_create(&E,NULL,et,"E");
 
    pthread_join(A,NULL);
    pthread_join(B,NULL);
    pthread_join(C,NULL);
    pthread_join(D,NULL);
    pthread_join(E,NULL);

    return 0;
}

程序实现

【Linux】哲学家就餐问题_第2张图片

你可能感兴趣的:(Linux学习记录)