zoukankan      html  css  js  c++  java
  • 哲学家问题

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

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

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

    这样就能避免死锁了。

    #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
    ",i);k++;
                usleep(10);
                pthread_mutex_unlock(&chopsticks[i]);
                pthread_mutex_unlock(&chopsticks[(i+1)%5]);    
                
    
                }else{
    
                    
                    printf("zhexuejia %d is thinking
    ",i);k++;
                    pthread_mutex_unlock(&chopsticks[i]);
                    usleep(10);
    
                }
    
    
    
    
            }else{
    
                printf("zhexuejia %d is thinking
    ",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);
    
    
    
    
    
    }

  • 相关阅读:
    VR虚拟现实眼镜那些事
    C#使用MysqlBackup.Net 备份MySQL数据库
    AgileConfig服务端搭建
    IE浏览器,各版本的请求头信息
    搜索算法
    一个完整的信号采集系统项目开发流程
    Linux内核模块简介
    搭建wordpress开发环境
    AbstractRoutingDataSource+AOP+JNDI实现spring动态数据源
    Linux 挂载磁盘记录
  • 原文地址:https://www.cnblogs.com/wzben/p/5410742.html
Copyright © 2011-2022 走看看