与互斥锁不同的是,条件变量是用来等待而不是用来上锁的,条件变量本身就不是锁!
条件变量用来自动阻塞一个线程,直到某种特殊情况发生为止,通常和互斥锁一起使用 。
条件变量的两个动作:
- 条件不满,阻塞线程
- 条件满足,通知阻塞的线程开始工作
条件变量的接口条件变量是一个类型为pthread_cond_t的条件变量,课通过定义变量的方式来定义一个条件变量
- 条件变量初始化
- 条件变量的销毁
- 等待条件变量满足
条件变量是实现线程同步的一种手段,如果一个线程进入等待队列还不释放锁资源,这样其他线程也不能够得到锁资源,这样唤醒线程的条件变量永远不可能满足,那么这个线程也将一直等待下去 。所以一个线程进入等待队列需要释放自己手中的锁资源来实现真正地同步
- 唤醒条件变量
#include<stdio.h>#include<pthread.h>#include<unistd.h>//创建条件变量pthread_cond_t cond;//创建互斥锁pthread_mutex_t mutex;//线程处理函数1void *threadfun1(void *arg){ char* name = (char*)arg; while(1) { pthread_mutex_lock(&mutex); pthread_cond_wait(&cond,&mutex); printf("%s is waked up...\n",name); sleep(1); pthread_mutex_unlock(&mutex); } }//线程处理函数2void *threadfun2(void *arg){ char *name = (char *)arg; while(1) { sleep(1); //唤醒一个等待队列中的线程 pthread_cond_signal(&cond); printf("%s is wakeding up a thread...\n",name); }}int main(){ pthread_t pthread1,pthread2,pthread3,pthread4,pthread5; //初始化条件变量 pthread_cond_init(&cond,NULL); //初始化互斥锁 pthread_mutex_init(&mutex,NULL); //创建五个线程 pthread_create(&pthread1,NULL,threadfun1,(void *)"pthread 1"); pthread_create(&pthread2,NULL,threadfun1,(void *)"pthread 2"); pthread_create(&pthread3,NULL,threadfun1,(void *)"pthread 3"); pthread_create(&pthread4,NULL,threadfun1,(void *)"pthread 4"); pthread_create(&pthread5,NULL,threadfun2,(void *)"pthread 5");//等待线程结束 pthread_join(pthread1,NULL); pthread_join(pthread2,NULL); pthread_join(pthread3,NULL); pthread_join(pthread4,NULL); pthread_join(pthread5,NULL); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0;}
经验总结扩展阅读
- 1500大卡相当于多少食物
- 为什么二手房越来越难卖
- 龙眼泡酒配方
- 香菇蒸多久能蒸熟
- 一条香烟不拆封能放多久
- 2023年农历七月十二适不适合结婚
- 2023年农历七月十六可不可以结婚农历二零二三年七月十六能不能结婚
- 2023年农历七月二十结婚会幸福吗
- 2023年农历七月二十一是不是结婚吉日 今天可以迎亲吗
- 2023年农历七月二十二结婚吉利吗 是黄道吉日吗