【C/C++多线程编程之八】pthread条件变量
多线程编程之条件变量
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);
该函数销毁条件变量。
4.牛刀小试:
共享资源i,线程1对i进行无限加1操作,并输出所有非5倍数的i值。当i的值为5的倍数时,通过条件变量机制,通知线程2,线程2输出此时的i值。
#include "pthread.h"
#include "sched.h"
#include "semaphore.h"
#include "stdio.h"
#include "windows.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);
printf("code before pthread_con_wait");
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);
return 0;
}
来自 <https://blog.csdn.net/lovecodeless/article/details/24929273>
【C/C++多线程编程之八】pthread条件变量相关推荐
- Linux操作系统下的多线程编程详细解析----条件变量pthread_cond_t那些事儿
推荐两个博文: http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html http://blog.csdn.net/sunboy_2 ...
- c++11多线程编程同步——使用条件变量condition variable
简述 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量. c++11提供的 condition_variable 类是一个同步原语, ...
- Linux操作系统下的多线程编程详细解析----条件变量
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...
- c++11 多线程编程(六)------条件变量(Condition Variable)
互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...
- Linux多线程编程四(条件变量)
2019独角兽企业重金招聘Python工程师标准>>> 前一节中我们讲述了如何使用互斥锁来实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.而条件变量通 ...
- linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件
PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为"相等"的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序.举 ...
- pthread 条件变量
pthread条件变量 muduo/base/Condition.h中有对条件变量的封装,底层是pthread 条件变量. 条件变量 条件变量是线程使用的一种同步机制.条件变量给多个线程提供了会合的场 ...
- 多线程编程之七:pthread条件变量
###Date: 2017/11/14 转载自:http://blog.csdn.net/lovecodeless/article/details/24929273 Pthread是 POSIX t ...
- Python并行编程(四):多线程同步之condition(条件变量)实现带有缓冲区的生产者-消费者模型...
什么是Condtion? 所谓condition条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 这种同步机制就是一个线程等待特定的条件,另一个线程通知它条件已经发生.一旦条件发 ...
最新文章
- java多态性补充-instanceof关键字
- marbin mysql_跨浏览器图像灰度(grayscale)解决方案
- Java-进阶:Java-File--IO—1
- STM32之外部中断原理
- 为bootstrap+angularJs打造的表格代码生成器
- java语言与c++语言相比_最突出的特点是_Java 语言与C++语言相比,最突出的特点是( )。_学小易找答案...
- linux7怎么配yum,centos7怎么配置yum
- 孙鑫VC学习笔记:第十五讲 (三) 增加互斥条件实现线程同步
- Juniper JunOS PPPOE配置
- 谷歌浏览器百度网盘在线倍速播放
- 2021职业技能鉴定2021维修电工证(中级)考试题
- VMware Workstation for Windows 历史版本
- 出现老是弹出Visual Studio 实时调试器 的问题
- coldfusion_为ColdFusion辩护
- canvas 刮刮卡
- linux命令报错,在Linux执行命令报错”Arg list too long”的原因分析 – 运维派
- Mstar Mac Phy 驱动学习
- python爬取猫猫图
- 深拷贝的五种实现方式
- mongo基础之 CRUD操作(3)
热门文章
- C# 网站静态页面生成器 for 多线程版
- 超越村后端开发(3:安装djangorestframework+序列化+API开发前期准备)
- max的贴图烘焙技术简易流程
- 【校招面试 之 C/C++】第17题 C 中的malloc相关
- .NET C#使用微信公众号登录网站
- EMVTag系列9《卡片管理数据》
- Entity Framework 学习高级篇1—改善EF代码的方法(上)
- hdu 1757 矩阵连乘
- C++找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点)
- C语言编译过程总结详解