#include <stdio.h>#include <pthread.h>#include <unistd.h>//线程的两个互斥量pthread_mutex_t mutex1;pthread_mutex_t mutex2;//线程1处理函数void *fun1(void *arg){ //线程1先申请资源1,再申请资源2 //加锁 pthread_mutex_lock(&mutex1); printf("线程1加锁资源1ok....\n"); pthread_mutex_lock(&mutex2); printf("线程1加锁资源2ok....\n"); printf("线程1执行临界代码"); //解锁 pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); return NULL; }//线程2处理函数void *fun2(void* arg){ //线程2先申请资源2,再申请资源1 //加锁 pthread_mutex_lock(&mutex2); printf("线程2加锁资源1ok....\n"); pthread_mutex_lock(&mutex1); printf("线程2加锁资源2ok....\n"); printf("线程2执行临界区代码....\n"); //解锁 pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); return NULL;}//演示死锁int main(){ int ret = -1; int ret1 = -1; pthread_t tid1,tid2; //初始化互斥量 pthread_mutex_init(&mutex1,NULL); pthread_mutex_init(&mutex2,NULL); //创建两个线程 pthread_create(&tid1,NULL,fun1,NULL); pthread_create(&tid2,NULL,fun2,NULL); //回收资源 ret = pthread_join(tid1,NULL); ret = pthread_join(tid2,NULL); if(0!=ret) { printf("线程1资源回收失败\n"); return 1; } if(0!=ret1) { printf("线程2资源回收失败\n"); return 1; } //销毁互斥锁 pthread_mutex_destroy(&mutex1); pthread_mutex_destroy(&mutex2); return 0;}运行结果如下:

文章插图
两个进程都想获得对方的锁,造成死锁 。
条件变量概念利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”(给出条件成立信号) 。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起 。
同步: 在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而避免饥饿问题,叫做同步
为什么存在线程同步?
线程同步使得每个线程都能够访问临界资源,多个线程协同高效完成某些任务 。
条件变量如何与互斥锁结合使用?
条件变量是包含一个等待队列的 。多个线程可以去竞争一把锁,没有得到锁资源的线程会在锁上继续挂起等待,当拥有锁的线程条件变量满足时,会先释放锁资源,然后进入到条件变量的等待队列去等待(等待其他线程唤醒),这样其他线程就可以获得锁资源,如果此时唤醒的条件变量满足,该线程可以去唤醒等待队列中的第一个线程,自己释放锁资源,然后让第一个线程重新拥有锁资源,依次如此,多个线程就是顺序地执行工作 。这样就可以实现线程同步的操作 。
经验总结扩展阅读
- 1500大卡相当于多少食物
- 为什么二手房越来越难卖
- 龙眼泡酒配方
- 香菇蒸多久能蒸熟
- 一条香烟不拆封能放多久
- 2023年农历七月十二适不适合结婚
- 2023年农历七月十六可不可以结婚农历二零二三年七月十六能不能结婚
- 2023年农历七月二十结婚会幸福吗
- 2023年农历七月二十一是不是结婚吉日 今天可以迎亲吗
- 2023年农历七月二十二结婚吉利吗 是黄道吉日吗
