哲学家问题

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

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

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

这样就能避免死锁了。

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





}

 

posted @ 2016-04-19 23:28  wzb的QQ空间  阅读(368)  评论(0编辑  收藏  举报