信号量与条件变量的区别
注意信号量与条件变量的区别
int pthread_cond_signal(pthread_cond_t * cond);
pthread_cond_signal通过条件变量cond发送消息,若多个消息在等待,它只唤醒一个。
互斥锁的类型,有以下几种:PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
且在调用pthread_cond_wait()前必须由本线程加锁 (pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开 pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。
下面是另一处说明:给出了函数运行全过程。 为什么在唤醒线程后要重新mutex加锁?
了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。
锁定互斥对象时,线程将调用 pthread_cond_wait(&mycond,&mymutex)。
In Thread1: pthread_mutex_lock(&m_mutex); pthread_cond_wait(&m_cond,&m_mutex); pthread_mutex_unlock(&m_mutex); In Thread2: pthread_mutex_lock(&m_mutex); pthread_cond_signal(&m_cond); pthread_mutex_unlock(&m_mutex);
为什么要与pthread_mutex 一起使用呢?
pthread_cond_signal即可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也可以放在pthread_mutex_lock和pthread_mutex_unlock之后,但是各有有缺点。
pthread_mutex_lock
xxxxxxx
pthread_cond_signal
pthread_mutex_unlock
所以在Linux中推荐使用这种模式。
pthread_mutex_lock
xxxxxxx
pthread_mutex_unlock
pthread_cond_signal
优点:不会出现之前说的那个潜在的性能损耗,因为在signal之前就已经释放锁了
缺点:如果unlock和signal之前,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程(cond_wait的线程),而这在上面的放中间的模式下是不会出现的。
信号量与条件变量的区别相关推荐
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- 信号量和条件变量的区别
互斥锁与信号量的异同 当信号量的初值为1,且在0和1之间变化时,成为二元信号量.其与互斥锁的区别在于:互斥锁有拥有者这一概念,信号量则没有.互斥锁由同一线程加放锁,信号量可以由不同线程进行PV操作. ...
- Python——信号量、条件变量、事件
1.信号量(Semaphore) 信号量通常用于保护数量有限的资源,例如数据库服务器.在资源数量固定的任何情况下,都应该使用有界信号量.在生成任何工作线程前,应该在主线程中初始化信号量. 信号量提供a ...
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 信号量 互斥锁 条件变量的区别
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某 ...
- Linux 多线程同步机制:互斥量、信号量、条件变量
互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...
- QThread中的互斥、读写锁、信号量、条件变量
该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78431 在gemfield的<从pthread到QThread>一文中我们了解了线 ...
- Linux下多线程同步方式之互斥量,信号量,条件变量
// linux_thread_syn.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"//互斥量 #include <cstdio> ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
最新文章
- win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris
- cisco 生成树协议PVST+
- EF Core的一个紧急bug,我这样修改
- android--在命令行中生成Android的数字证书keystore文件
- fx5u以太网通讯设置_操作示例 | 实现S7300和FX5U的数据交换
- redis常用命令及安全Redis集群环境搭建
- 矩阵分析与应用课程资料
- java单例调用_java单例模式
- Eclipse 设置护眼背景色
- Anddroid IM来电铃声通过耳机播放
- CentOS7.5安装Oracle19c
- day27-迭代器协议,协程,同步异步
- 阿里云人脸识别新版SDK对接(java)
- Go-Gorm-基本操作
- SpringBoot缓存注解的使用
- 公共基础知识:浅析生活中的酒
- paypal集成国际支付
- 万字解析Activiti7流程框架
- 自主云服务器处理器_鼎甲与飞腾FT2000+/64处理器完成兼容性互认证
- 通过frp搭建属于自己的免费稳定的内网穿透服务