条件变量

条件变量是线程可用的另一种同步机制,条件标量给多个线程提供了一种会合的场所,条件变量和互斥所一起使用,允许线程一无竞争的方式等待特定的条件发生。条件变量本身是需要互斥锁进行保护的,线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥两之前不会察觉到这种改变,因为必须锁住互斥量才能计算出条件!

opthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)函数传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件。因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得其它线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。当pthread_cond_wait返回的时候又自动给mutex加锁。

o函数使用过程如下:

/************pthread_cond_wait()的使用方法**********/

pthread_mutex_lock(&qlock);    /*lock*/

pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/

pthread_mutex_unlock(&qlock); /*unlock*/

/*****************************************************/

下面是具体例子

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
void *thread1(void *);
void *thread2(void *);
int i=1;
int main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
pthread_join(t_a, NULL);/*等待进程t_a结束*/
pthread_join(t_b, NULL);/*等待进程t_b结束*/
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}
void *thread1(void *junk)
{
for(i=1;i<=6;i++)
{
pthread_mutex_lock(&mutex);/*锁住互斥量*/
printf("thread1: lock %d/n", __LINE__);
if(i%3==0){
printf("thread1:signal 1  %d/n", __LINE__);
pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
printf("thread1:signal 2  %d/n", __LINE__);
sleep(1);
}
pthread_mutex_unlock(&mutex);/*解锁互斥量*/
printf("thread1: unlock %d/n/n", __LINE__);
sleep(1);
}
}
void *thread2(void *junk)
{
while(i<6)
{
pthread_mutex_lock(&mutex);
printf("thread2: lock %d/n", __LINE__);
if(i%3!=0){
printf("thread2: wait 1  %d/n", __LINE__);
pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/
printf("thread2: wait 2  %d/n", __LINE__);
}
pthread_mutex_unlock(&mutex);
printf("thread2: unlock %d/n/n", __LINE__);
sleep(1);
}
}

示例转载于博客:http://blog.csdn.net/hongmy525/article/details/5194006#

pthread_cond_wait()理解相关推荐

  1. linuxc线程信号-pthread_cond_wait理解

    pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数 传入的參数mutex用于保护条件,由于我们在调用pthread_con ...

  2. 深入理解pthread_cond_wait、pthread_cond_signal

    ===============================man pthread_cond_wait的解释========================== LINUX环境下多线程编程肯定会遇到 ...

  3. 对pthread_cond_wait()函数的理解

    对pthread_cond_wait()函数的理解(我在CU上回复一个人的问题的解答) (个人见解,如有错误,恳请大家指出) /************pthread_cond_wait()的使用方法 ...

  4. 轻松理解pthread_cond_wait和pthread_cond_signal的使用

    原文:https://blog.csdn.net/yeyuangen/article/details/37593533 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthre ...

  5. linux互斥锁和条件变量,如何理解互斥锁和条件变量?

    下面的代码出自<Unix/Linux编程实践教程>,作用是用两个线程分别统计两个文件的单词的数目,并在主线程中计算总数.下面是运行截图: 但是看了半天还是难以理解下面代码中的加锁.解锁以及 ...

  6. pthread_cond_wait()函数的详解

    http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线 ...

  7. [深入理解Android卷一全文-第九章]深入理解Vold和Rild

    为什么80%的码农都做不了架构师?>>>    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的 ...

  8. pthread_cond_wait()加一个while为什么的解释

    等号上面这段是大多数网上给pthread_cond_wait()加一个while为什么的解释:但是有些地方不太明白或者说没有解释清晰: 准备:1:pthread_cond_singal是唤醒至少一个线 ...

  9. 深入理解 Java 锁与线程阻塞

    相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话 ...

最新文章

  1. 自制程序清除系统垃圾文件
  2. CF1006E Military Problem
  3. 前百度首席科学家吴恩达携手富士康,要用人工智能升级制造业
  4. SharePoint Application Page启用匿名访问
  5. php 特殊符号处理,处理特殊符号的方法-php技巧
  6. 宜搭小技巧|找不到应用怎么办?群应用一键直达
  7. ACM比赛技巧之文件数据输入与输出
  8. spring boot actuator 如何显示详细信息
  9. NFT商城/NFT盲盒/虚拟盲盒/NFT交易/可定制二开
  10. 对象转map工具类BeanUtil
  11. 夏普mx2608n网络扫描到计算机,【转载】夏普复印机网络扫描教程
  12. 现在大家如何搭建一款神兽H5游戏
  13. html页面最大化最小化设置,网页窗口最大化快捷键 改变窗口大小的快捷键是什么...
  14. eda交通灯控制器波形输入_交通灯控制器课程设计.doc
  15. 笛卡尔坐标为什么叫Cartesian coordinate而不是Descartes coordinate?
  16. JavaScript 学习笔记 - 12 JavaScript 应用示例
  17. R语言入门基础——基础操作篇(极为基础的指令代码)
  18. Go的研习笔记day-1
  19. python 3d图形库_PythonOCC 3D图形库学习—导入STEP模型
  20. 不忘初心,方得始终!——纪念我逝去的大学生活

热门文章

  1. 弱电布线施工规范与工艺(适用于强电与弱电改造)
  2. 电脑上打印准考证照片不清楚咋办
  3. OSChina 周五乱弹 —— 到底哪个更重要
  4. 中华大地第二次大变革 看印度反思自我之六 印度模式更有吸引力
  5. 【CAD-Web】CAD/DWG的Web化
  6. Thinkphp5+JWT开发 api接口
  7. TLC2558IDWIC 12BIT 400 KSPS AD S/O 20-SOIC
  8. web项目经理手册-项目经理需要铭记在心...
  9. 论文阅读 Jointly Optimize Data Augmentation and Network Training
  10. 自动添加控件,一次提交多条记录。