推荐的pthread_cond_wait()和pthread_cond_signal()使用方式:
pthread_mutex_lock(&m);
while( condition_is_false )
        pthread_cond_wait(&cond, &m);
pthread_mutex_unlock(&m);

另一端一般是:
pthread_mutex_lock(&m); // pthread_cond_wait已自动释放锁
......
pthread_cond_signal(&v);
pthread_mutex_unlock(&m); // 释放锁,使得pthread_cond_wait可以自动再次获得锁

注意调用pthread_cond_wait()之前必须获得锁。pthread_cond_wait()其实对互斥量做了操作,首先,将解锁与挂起线程做为原子操作执行,这样pthread_cond_signal()即可获互斥量。当pthread_cond_wait()返回时,又会自动加锁,所以其效果相当于持有的锁的状态没有改变。

被pthread_cond_wait()阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒(造成假唤醒)。pthread_cond_wait()函数的返回并不意味着条件的值一定发生了变化(有可能是假唤醒),也可能是函数出错返回,因此必须重新检查条件的值,比如用while()来确认。pthread_cond_wait()函数返回时,相应的互斥锁将被当前线程锁定。

必须在互斥锁的保护下使用相应的条件变量。否则对条件变量的通知有可能发生在等待条件变量之前,从而造成死锁;导致死锁的最常见错误是自死锁或递归死锁。在自死锁或递归死锁中,线程尝试获取已被其持有的锁。递归死锁是在编程时很容易犯的错误。另外,如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。

也可以用int pthread_cond_timedwait(),函数到了一定的时间,即使条件未发生也会解除阻塞(返回ETIMEDOUT)。函数返回时,相应的互斥锁往往是锁定的,即使是函数出错返回。

对于pthread_cond_broadcast(),不同的线程可以共用一个条件变量,但是锁还是要不同的,因为在wait()之前一定要获得锁;如果确认对锁没有造成死锁的竞争,pthread_cond_broadcast()的方式用一个锁也可以。

PS: 条件变量函数并不是异步信号安全的,因此不能在信号处理函数中调用。具体地说,在信号处理函数中调用 pthread_cond_signal() 或 pthread_cond_broadcast() 可能会导致调用线程的死锁。

pthread条件变量函数的使用相关推荐

  1. pthread 条件变量

    pthread条件变量 muduo/base/Condition.h中有对条件变量的封装,底层是pthread 条件变量. 条件变量 条件变量是线程使用的一种同步机制.条件变量给多个线程提供了会合的场 ...

  2. Linux系统编程38:多线程之什么是线程同步以及条件变量函数

    文章目录 (1):什么是线程的同步 (2):实现线程同步-条件变量函数 (1):什么是线程的同步 假如有一片临界资源,线程A和B都会修改它,为了保护资源所以要加锁,此时它们之间是互斥的关系.在我们的代 ...

  3. pthread和互斥量条件变量函数意义速查表

    数据类型 pthread_t 线程 互斥量和条件变量

  4. 【C/C++多线程编程之八】pthread条件变量

    多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程 ...

  5. 多线程编程之七:pthread条件变量

    ###Date: 2017/11/14 转载自:http://blog.csdn.net/lovecodeless/article/details/24929273  Pthread是 POSIX t ...

  6. linux 条件变量函数,Linux线程同步之条件变量

    条件变量变量也是出自POSIX线程标准,另一种线程同步机制,.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量 ...

  7. 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁

    一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,cons ...

  8. linux线程间同步(1)互斥锁与条件变量

    线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...

  9. POSIX 条件变量

    1.条件变量 (1)当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了.例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将节点添加到队列中.这种情况就需要 ...

最新文章

  1. MySQL DATE_FORMAT() 函数
  2. MySQL基础之DML语句
  3. 利用SOS扩展库进入高阶.NET6程序的调试
  4. 中职计算机说课稿三篇,精选中职计算机说课稿三篇-20210609060707.docx-原创力文档...
  5. 【Python实战】使用python批量生成发票
  6. Tools:Android studio 使用
  7. Kafka常用运维操作命令
  8. Java编程测试1M内存可用来缓存多少对象
  9. TransCAD划分交通小区及求PA的问题
  10. [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.9
  11. 把html模板vue框架,vue框架搭建个人博客网站模板
  12. 手机mstsc远程工具_mstsc远程工具
  13. 盘点面试中常见的智力题
  14. 成为技术传播者(二):Why and Why NOT
  15. 【OpenGrok代码搜索引擎】一、OpenGrok简介
  16. 供应脂质体形成材料DSPE-PEG-Thiol,DSPE-PEG-SH
  17. ubuntu自带Firefox安装flash插件
  18. python 读写csv文件(创建、追加、覆盖)_python文件操作
  19. 【IDEA】快捷重写equals方法
  20. 播放器上音频断续问题的原因

热门文章

  1. 解决python-kafka连接kafka时报错kafka.errors.NoBrokersAvailable: NoBrokersAvailable
  2. php 芝麻认证think_PHP 芝麻信用接入的注意事项
  3. 华为p20支持手机云闪付吗_余承东:明年华为智能手机全面支持鸿蒙系统
  4. Visual Studio Code 使用指南
  5. 2016年百度面试题
  6. 关于gcc -o 的使用问题
  7. HOJ 1157 SCUD Busters
  8. 解题报告 Toy Bricks
  9. java 蓝桥杯算法训练 sign函数
  10. 一加6手机突然没信号没服务器,如何从技术上解决手机信号问题?一加6替你想到了...