码迷,mamicode.com
首页 > 其他好文 > 详细

哲学家问题

时间:2016-04-20 00:30:53      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

每次获得一个筷子,会引起死锁的。

解决的办法是,每次尝试去获取所需的两个筷子。第一次获取左边的,第二次获取右边的。

只有当两个都获取到了,才吃东西。否则就要释放所有获得的筷子。

这样就能避免死锁了。

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

pthread_mutex_t chopsticks[5];

void fun(int i){

    
    int k = 0;    
    
    while(k<50){


        if(pthread_mutex_trylock(&chopsticks[i])==0){

            if(pthread_mutex_trylock(&chopsticks[(i+1)%5])==0){
                
            printf("zhexuejia %d is eatinging\n",i);k++;
            usleep(10);
            pthread_mutex_unlock(&chopsticks[i]);
            pthread_mutex_unlock(&chopsticks[(i+1)%5]);    
            

            }else{

                
                printf("zhexuejia %d is thinking\n",i);k++;
                pthread_mutex_unlock(&chopsticks[i]);
                usleep(10);

            }




        }else{

            printf("zhexuejia %d is thinking\n",i);k++;
            usleep(10);

        }


        




    }


}

int main(){

    int t = 0;
    while(t<5){

    pthread_mutex_init(&chopsticks[t],NULL);
    t++;

    }

    pthread_t tid1,tid2,tid3,tid4,tid5;
    pthread_create(&tid1,NULL,(void*)fun,0);
    pthread_create(&tid2,NULL,(void*)fun,1);
    pthread_create(&tid3,NULL,(void*)fun,2);
    pthread_create(&tid4,NULL,(void*)fun,3);
    pthread_create(&tid5,NULL,(void*)fun,4);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);
    pthread_join(tid4,NULL);
    pthread_join(tid5,NULL);





}

 

技术分享

哲学家问题

标签:

原文地址:http://www.cnblogs.com/wzben/p/5410742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!