pthread条件变量函数的使用
推荐的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条件变量函数的使用相关推荐
- pthread 条件变量
pthread条件变量 muduo/base/Condition.h中有对条件变量的封装,底层是pthread 条件变量. 条件变量 条件变量是线程使用的一种同步机制.条件变量给多个线程提供了会合的场 ...
- Linux系统编程38:多线程之什么是线程同步以及条件变量函数
文章目录 (1):什么是线程的同步 (2):实现线程同步-条件变量函数 (1):什么是线程的同步 假如有一片临界资源,线程A和B都会修改它,为了保护资源所以要加锁,此时它们之间是互斥的关系.在我们的代 ...
- pthread和互斥量条件变量函数意义速查表
数据类型 pthread_t 线程 互斥量和条件变量
- 【C/C++多线程编程之八】pthread条件变量
多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程 ...
- 多线程编程之七:pthread条件变量
###Date: 2017/11/14 转载自:http://blog.csdn.net/lovecodeless/article/details/24929273 Pthread是 POSIX t ...
- linux 条件变量函数,Linux线程同步之条件变量
条件变量变量也是出自POSIX线程标准,另一种线程同步机制,.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量 ...
- 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁
一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,cons ...
- linux线程间同步(1)互斥锁与条件变量
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...
- POSIX 条件变量
1.条件变量 (1)当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了.例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将节点添加到队列中.这种情况就需要 ...
最新文章
- MySQL DATE_FORMAT() 函数
- MySQL基础之DML语句
- 利用SOS扩展库进入高阶.NET6程序的调试
- 中职计算机说课稿三篇,精选中职计算机说课稿三篇-20210609060707.docx-原创力文档...
- 【Python实战】使用python批量生成发票
- Tools:Android studio 使用
- Kafka常用运维操作命令
- Java编程测试1M内存可用来缓存多少对象
- TransCAD划分交通小区及求PA的问题
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.9
- 把html模板vue框架,vue框架搭建个人博客网站模板
- 手机mstsc远程工具_mstsc远程工具
- 盘点面试中常见的智力题
- 成为技术传播者(二):Why and Why NOT
- 【OpenGrok代码搜索引擎】一、OpenGrok简介
- 供应脂质体形成材料DSPE-PEG-Thiol,DSPE-PEG-SH
- ubuntu自带Firefox安装flash插件
- python 读写csv文件(创建、追加、覆盖)_python文件操作
- 【IDEA】快捷重写equals方法
- 播放器上音频断续问题的原因
热门文章
- 解决python-kafka连接kafka时报错kafka.errors.NoBrokersAvailable: NoBrokersAvailable
- php 芝麻认证think_PHP 芝麻信用接入的注意事项
- 华为p20支持手机云闪付吗_余承东:明年华为智能手机全面支持鸿蒙系统
- Visual Studio Code 使用指南
- 2016年百度面试题
- 关于gcc -o 的使用问题
- HOJ 1157 SCUD Busters
- 解题报告 Toy Bricks
- java 蓝桥杯算法训练 sign函数
- 一加6手机突然没信号没服务器,如何从技术上解决手机信号问题?一加6替你想到了...