• 线程死锁例子


    /*  头文件 */  
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <sys/types.h>  
    #include <pthread.h>  
    #include <signal.h>  
      
    pthread_mutex_t mutex_one,mutex_two;  
    pthread_mutex_t mutex;  
    pthread_cond_t cond;  
      
    void *thread_routine_one(void *arg)  
    {  
        pthread_cond_wait(&cond,&mutex);//确保two线程先运行  
      
        printf("thread_routine_one: lock mutex_one!
    ");  
        pthread_mutex_lock(&mutex_one);  
      
        printf("thread_routine_one: lock mutex_two!
    ");  
        pthread_mutex_lock(&mutex_two);//获取two锁,这个要等待two线程对two锁的释放  
      
        sleep(1);  
        printf("thread_routine_one: unlock mutex_two!
    ");  
        pthread_mutex_unlock(&mutex_two);  
      
        printf("thread_routine_one: unlock mutex_one!
    ");  
        pthread_mutex_unlock(&mutex_one);  
      
        return NULL;  
    }  
      
    void *thread_routine_two(void *arg)  
    {  
        printf("thread_routine_two: lock mutex_two!
    ");  
        pthread_mutex_lock(&mutex_two);//获取two锁  
        pthread_cond_signal(&cond);//让one线程运行  
        sleep(1);//休眠,让one可以先运行获取one锁  
      
        printf("thread_routine_two: lock mutex_one!
    ");  
      
        pthread_mutex_lock(&mutex_one);//获取one锁,这个同样必须等待one线程多one锁的释放  
      
        /**这时出现死锁现象了,在two线程要等待one线程对one锁的释放,同时two锁没有释放 
         * 然而在one线程需要等待two线程对two锁的释放,然后才会对one锁的释放!出现相互等待的过程**/  
      
        printf("thread_routine_two: unlock mutex_one!
    ");  
        pthread_mutex_unlock(&mutex_one);  
      
        printf("thread_routine_two: unlock mutex_two!
    ");  
        pthread_mutex_unlock(&mutex_two);  
      
        return NULL;  
    }  
      
    void main()  
    {  
        pthread_t pthread_one,pthread_two;  
      
        pthread_mutex_init(&mutex_one,NULL);  
        pthread_mutex_init(&mutex_two,NULL);  
        pthread_mutex_init(&mutex,NULL);  
        pthread_cond_init(&cond,NULL);  
      
        pthread_create(&pthread_one,NULL,thread_routine_one,NULL);  
        pthread_create(&pthread_two,NULL,thread_routine_two,NULL);  
      
        while(1)  
            sleep(1);  
    }  

     线程程A已经拥有至少一个资源,此时又去申请其他资源,而该资源又正在被B线程使用,而同时B线程也在等待A线程的资源释放后才会释放自己的资源,便会造成死锁。此时请求进程阻塞,但对自己已经获得的资源保持不放,

  • 相关阅读:
    虚拟列表
    vue中使用postcsspxtorem实现适配
    打包工具 rollup.js 入门教程
    后端一次给你10万条数据,如何优雅展示,到底考察我什么
    手写Promise原理
    react路由集中管理及鉴权 reactrouterconfig
    结合代码实践,全面学习前端工程化
    KDE 全局菜单文字颜色不随 Plasma Style 变化
    vue使用intro.js引导组件
    第五章、Vue3高级
  • 原文地址:https://www.cnblogs.com/mcy0808/p/7420955.html
Copyright © 2020-2023  润新知