1、条件变量的概念

一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待。线程B可以产生线程A继续执行的信号。条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题。POSIX线程库提供了条件变量这种同步机制。使用条件变量需要联合互斥锁一起使用。

2、如何声明一个条件变量

#include <pthread.h>pthread_cond_t cond;

3、如何初始化一个条件变量

//静态初始化条件变量
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//动态初始化条件变量
pthread_cond_t cond;
pthread_cond_init(&cond,NULL);//结合互斥锁的条件变量初始化结构变量
typedef struct{pthread_mutex_t mutex;//互斥pthread_cond_t cond;//条件int  value;//变量资源
}mutexcond_t;mutexcond_t mymutexcond = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,0};

静态初始化的条件变量不需要销毁,动态初始化的条件变量需要销毁,销毁函数声明如下:

int pthread_cond_destroy(pthread_cond_t *cond);

4、如何阻塞含条件变量的线程

线程执行等待条件变量后,将一直阻塞或计时阻塞,两个函数接口:pthread_cond_wait,pthread_cond_timewait。

int pthread_cond_wait(pthread_cond_t * restrict cond, pthread_mutex_t *restrict mutex);int pthread_cond_timewait(pthread_cond_t * restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);

关键字:restrict,限制,表明指针修饰的指针是访问一个数据对象的惟一且初始的方式。

pthread_cond_wait传入两个参数,一个条件变量cond指针和一个互斥变量mutex指针。互斥变量的作用是防止多线程同时调用pthread_cond_wait形成竞争。一旦调用cond_wait会临时对cond进行加锁,当条件不满足时,会阻塞并挂起当前等待,内核自动释放mutex锁给其他线程使用当前cond,从而防止多线程在等待同一个cond时,无法充分利用资源。

5、如何唤醒等待条件变量的线程

//只唤醒一个等待条件变量的线程
int pthread_cond_signal(pthread_cond_t *cond);//唤醒所有等待条件变量的线程
int pthread_cond_broadcast(pthread_cond_t *cond);

6、总结用法

条件变量和互斥锁的用法比较绕,总结一下就是。

  • 调用pthread_cond_wait之前,必须给互斥锁上锁pthread_mutex_lock(&mutex)。
  • 一旦执行到pthread_cond_wait,如果没有收到pthead_cond_signal发出的cond信号,pthread_cond_wait会自动解锁,并一直阻塞。
  • 一旦pthread_cond_wait收到pthread_cond_signal发出的cond信号,pthread_cond_wait会自动加锁,因此,条件变量满足后进入临界区,执行结束需要pthread_mutex_unlock(&mutex)解锁。
// 线程1
{pthread_mutex_lock(&mutex);...pthread_cond_signal(&cond);//唤醒等待cond的线程...pthread_mutex_unlock(&mutex);
}// 线程2
{pthread_mutex_lock(&mutex);...pthread_cond_wait(&cond,&mutex);//等待条件变量...pthread_mutex_unlock(&mutex);
}

Linux多线程开发-线程同步-条件变量pthread_cond_t相关推荐

  1. Linux多线程开发-线程同步-读写锁pthread_rwlock_t

    1.读写锁概念 对资源的访问抽象为两种类型,即独占和共享.独占资源具有排他性,例如写操作.共享资源可以同时由多个线程访问,不对该资源执行写操作.针对资源的读和写操作分别加锁,写操作加锁与互斥锁相同,但 ...

  2. Linux多线程开发-线程同步-互斥锁pthread_mutex_t

    1.互斥锁 同一时刻只允许一个线程对临界区进行访问.POSIX库中用类型pthread_mutex_t来定义互斥锁,类型在pthreadtypes.h中定义. 2.如何声明一个互斥锁 #include ...

  3. 3、Linux多线程,线程同步(转)

    3.Linux多线程,线程同步 5)线程私有数据 进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有.但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-spec ...

  4. Linux操作系统下的多线程编程详细解析----条件变量pthread_cond_t那些事儿

    推荐两个博文: http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html http://blog.csdn.net/sunboy_2 ...

  5. Linux多线程之线程同步

    线程最大的特点就是资源的共享性,所以也就有了一个难点线程同步,实现线程同步的方法最常用的方法是:互斥锁,条件变量和信号量.接下来就让我们来看下这几种同步的方法. 一.互斥锁(Mutex) 获得锁的线程 ...

  6. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

  7. Linux多线程编程四(条件变量)

    2019独角兽企业重金招聘Python工程师标准>>> 前一节中我们讲述了如何使用互斥锁来实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.而条件变量通 ...

  8. 线程同步--条件变量

    条件变量可以说是线程同步中运用最多的方式.最常见的是运用在消费者-生产者模型中. 一般由一个线程充当生产者,一个线程充当生产者.消费者需要等到足够量的数据才来消耗数据.在这中间生产者产生数据,并在数据 ...

  9. Linux 多线程开发-线程的属性-分离detached和连接joinable

    1.描述 linux的POSIX线程分离状态决定一个线程以什么方式来终止.默认的分离状态是可连接态(joinable),创建线程是参数设置为NULL,就是默认连接态,可以被pthread_join. ...

最新文章

  1. 公开课视频-《第04章 部署-Microsoft-服务器虚拟化-Hyper-V 2012 R2》
  2. 把ct图像像素值转化为_数字图像概论与基础
  3. python定义一个变量_Python新手上车3:Python第一个程序和变量
  4. Java集合总结【面试题+脑图】,将知识点一网打尽!
  5. pythonweb开发-如何用Python做Web开发?——Django环境配置
  6. android settings源代码分析(2)
  7. mysql哪些_初学MySQL哪些需要你知道
  8. c#中params关键字应用
  9. Win7中CHM打不开的解决方法
  10. jsdroid 教程_电气设计编程视频教程,涉及PLC、电气绘图、仿真等共400多份资料...
  11. 树莓派3b+安装openwrt 配置wan lan和wifi
  12. 学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作
  13. 4款让人心疼的电脑软件,由于免费又实用,常被同行挤压
  14. python中如何打出字符π
  15. kuwahara_filter滤波器----MATLAB
  16. 微信小程序中 iconfont 图标的使用(包括彩色图标)
  17. Ubuntu Kylin中编译运行cgminer挖矿软件
  18. AndroidIPC通信之AIDL
  19. P1536 村村通题解【并查集】
  20. 36 VS2010 无法打开 xxx.h 源文件

热门文章

  1. html5 支持表格吗,html5 – 在HTML 5中使用表格很好吗?
  2. android 网络调试 源代码,Android源代码调试环境搭建
  3. java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?
  4. andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...
  5. Javascript 函数详解
  6. Shell 脚本知识回顾 (六) —— Shell 函数
  7. Linux下定时器使用
  8. 关于 CFileDialog 对话框多选功能的一个问题
  9. BASH 中的字符串处理
  10. 接口报Provisional headers are shown原因和解决方法