###Date: 2017/11/14

转载自:http://blog.csdn.net/lovecodeless/article/details/24929273

 Pthread是 POSIX threads 的简称,是POSIX的线程标准。
        互斥机制,包括互斥量【C/C++多线程编程之六】pthread互斥量,信号量【C/C++多线程编程之七】pthread信号量,互斥能很好的处理共享资源访问的协调问题,是多线程同步必不可少的机制。互斥机制也有其缺陷,当线程在等待共享资源满足某个条件,互斥机制下,必须不断地加锁和解锁,其间查询共享资源是否满足条件,这将带来巨大的消耗。
        此时,需要新的机制来解决这个问题。
       1.条件变量机制:
        条件变量机制弥补了互斥机制的缺陷,允许一个线程向另一个线程发送信号(这意味着共享资源某种条件满足时,可以通过某个线程发信号的方式通知等待的线程),允许阻塞等待线程(当线程等待共享资源某个条件时,可让该线程阻塞,等待其他线程发送信号通知)。
        条件变量机制在处理等待共享资源满足某个条件问题时,具有非常高的效率,且空间消耗相比互斥机制也有优势。
    
        2.条件变量与互斥量:
       条件变量机制,所有等待一个条件变量的线程会形成一个队列,这个队列显然是全局的共享队列。当线程进入等待状态,将线程添加到队列就需要使用互斥量,防止多个线程同时使用pthread_cond_wait,在调用pthread_cond_wait前加锁互斥量,进入阻塞前解锁互斥量。这也解释了pthread_cond_wait函数参数需要互斥量。
        3.条件变量基本函数:
         #include <semaphore.h>
初始化条件变量:
        int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) ;
        该函数第一个参数为条件变量指针,第二个参数为条件变量属性指针(一般设为NULL)。该函数按照条件变量属性对条件变量进程初始化。
无条件等待:
        int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
        该函数第一个参数为条件变量指针,第二个为互斥量指针。该函数调用前,需本线程加锁互斥量,加锁状态的时间内函数完成线程加入等待队列操作 ,线程进入等待前函数解锁互斥量。在满足条件离开pthread_cond_wait函数之前重新获得互斥量并加锁,因此,本线程之后需要再次解锁互斥量。
通知一个线程:
        int pthread_cond_signal(pthread_cond_t *cond);
        该函数的参数为条件变量指针。该函数向队列第一个等待线程发送信号,解除这个线程的阻塞状态。
通知所有线程:
        int pthread_cond_broadcast(pthread_cond_t *cond);
        该函数的参数为条件变量指针。该函数想队列所有等待线程发送信号,解除这些线程的阻塞状态。
销毁条件变量:
        int pthread_cond_destroy(pthread_cond_t *cond);
        该函数销毁条件变量。

DEMO:

共享资源i,线程1对i进行无限加1操作,并输出所有非5倍数的i值。当i的值为5的倍数时,通过条件变量机制,通知线程2,线程2输出此时的i值。

#include <stdio.h>
#include <pthread.h>
#include <Windows.h>
#include <semaphore.h>
#pragma comment(lib, "pthreadVC2.lib")     //必须加上这句
pthread_t t1;           //pthread_t变量t1,用于获取线程1的ID
pthread_t t2;           //pthread_t变量t2,用于获取线程2的ID
pthread_mutex_t mutex;
pthread_cond_t cond;
int i = 0;                //共享资源
void * child1(void *arg)
{while (1){pthread_mutex_lock(&mutex);i++;if (i % 5 == 0){pthread_cond_signal(&cond);}else{printf("我是线程  1  打印的数都非5的倍数:  %d \n", i);}pthread_mutex_unlock(&mutex);Sleep(1000);}
}
void *child2(void *arg)
{while (1){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond, &mutex);       //获得信号之前,会重新获得互斥锁printf("我是线程  2  打印5的倍数:  %d \n", i);pthread_mutex_unlock(&mutex);          //需要在此处释放互斥锁Sleep(1000);}
}
int main(void)
{pthread_cond_init(&cond, NULL);pthread_mutex_init(&mutex, NULL);pthread_create(&t1, NULL, child1, NULL);pthread_create(&t2, NULL, child2, NULL);Sleep(100000000);}

Result:

多线程编程之七:pthread条件变量相关推荐

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

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

  2. c++11多线程编程同步——使用条件变量condition variable

    简述 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量. c++11提供的 condition_variable 类是一个同步原语, ...

  3. Linux操作系统下的多线程编程详细解析----条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...

  4. c++11 多线程编程(六)------条件变量(Condition Variable)

    互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...

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

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

  6. linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件

    PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为"相等"的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序.举 ...

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

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

  8. pthread 条件变量

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

  9. 【C/C++多线程编程之七】pthread信号量

    多线程编程之信号量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制. 信号量机制用于 ...

最新文章

  1. Hadoop源代码分析(包mapreduce.lib.input)
  2. ios math 那个头文件_iOS math.h数学函数
  3. uni-app echart 使用mpvueEcharts踩坑与流程
  4. 实现分页统计记录总数时: sql语句的异常
  5. F5和nginx配合转发前端请求
  6. 自动简单,完美解决 vissim4.3 每次启动修改时间问题!
  7. 现代信号处理 张贤达_清华大学信号处理著名学者张贤达去世,享年74岁
  8. 在线极限词,敏感词,违禁词查询工具
  9. iOS系统字体大全,iOS系统中所有的字体
  10. SQL中的DDL、DML、DCL、TCL是什么意思
  11. Unreal4 使用spline , splinemesh组件构建赛道小例子
  12. glove.840B.300d、glove.42B.300d、glove.6B下载
  13. 双通道IPC如何RTSP取两个通道视频流?
  14. 学习Python可以做什么工作?选哪些工作方向?
  15. Python的海龟绘图库turtle中tracer(False)和speed(0)的区别
  16. 亿赛通文档安全云服务正式启动
  17. linux 下串口编程VTIME和VMIN的设置(转)
  18. 五种主流web报表工具的功能对比
  19. 软件工程c语言程序设计考研,2016年浙江工商大学软件工程C语言程序设计考研复试题库...
  20. MySQL连接查询 内连接和外连接的区别

热门文章

  1. C# Spire.PDF 去处红色警告文字
  2. MySQL 8.0 表分区
  3. Tomcat 优化方案
  4. 三星s4 android 5.0 root权限,三星I9508V Android 4.4-5.0 (GALAXY S4 移动4G版)ROOT教程,图文详解如何ROOT...
  5. GOLANG实现模板模式
  6. 高效办公,从几行批处理命令开始,你知道吗?
  7. 原理.002.手机工作原理
  8. 慎用curl测网站速度
  9. Java如何判断数组是否相等呢?
  10. Cheat Engine破解妙用之一