3线程同步:条件变量
1条件变量
条件变量给多个线程提供了一个汇合的场所。
依赖的头文件
#include<pthread.h>
函数声明
定义分配条件变量
pthread_cond_t cond =PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t*restrict cond, const pthread_condattr_t *restrict attr);
名称: |
pthread_cond_init |
功能: |
initialize condition variables 初始化条件变量 |
头文件: |
#include <pthread.h> |
函数原形: |
|
参数: |
|
返回值: |
the pthread_cond_destroy() and pthread_cond_init() functions shall return zero; otherwise, an error number shall be returned to indicate the error |
int pthread_cond_destroy(pthread_cond_t*cond);
名称: |
pthread_cond_destroy |
功能: |
Destroy condition variables 销毁条件变量 |
头文件: |
#include <pthread.h> |
函数原形: |
int pthread_cond_destroy(pthread_cond_t *cond); |
参数: |
|
函数说明: |
在释放或废弃条件变量之前,需要毁坏它,使用此函数 |
返回值: |
the pthread_cond_destroy() and pthread_cond_init() functions shall return zero; otherwise, an error number shall be returned to indicate the error |
int pthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t *restrict mutex);
名称: |
pthread_cond_wait |
功能: |
Wait on a condition,等待某个条件是否成立。对于timewait()函数除了等待以外,可以设置一个时长。 |
头文件: |
#include <pthread.h> |
函数原形: |
intpthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); |
参数: |
|
函数说明: |
一旦初始化了互斥对象和条件变量,就可以等待这个条件,一个特定条件只能有一个互斥对象,而且条件变量应该表示互斥数据“内部”的一种特殊的条件更改。一个互斥条件可以用许多条件变量(例如:cond_empty,cond_full,cond_cleanup),但每个条件变量只能有一个互斥对象。 |
返回值: |
int pthread_cond_signal(pthread_cond_t*cond);
名称: |
pthread_cond_signal |
功能: |
signal a condition,这种情况是只有一个线程收到后执行动作。 |
头文件: |
#include <pthread.h> |
函数原形: |
int pthread_cond_signal(pthread_cond_t *cond); |
参数: |
|
函数说明: |
活动线程只需要唤醒第一个正在睡眠的线程。假设您只对队列添加了一个工作作业。那么只需要唤醒一个工作程序线程(再唤醒其它线程是不礼貌的!) |
返回值: |
int pthread_cond_broadcast(pthread_cond_t*cond);
名称: |
pthread_cond_broadcast |
功能: |
broadcast a condition,通过广播的形式发给子线程消息,子线程竞争执行。 |
头文件: |
#include <pthread.h> |
函数原形: |
int pthread_cond_broadcast(pthread_cond_t *cond); |
参数: |
|
函数说明: |
如果线程更改某些共享数据,而且它想要唤醒所有正在等待的线程,则应使用 pthread_cond_broadcast调用 |
返回值: |
案例说明:
#include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> struct msg { struct msg *next; int num; }; struct msg *head; /*条件变量 */ pthread_cond_t has_product = PTHREAD_COND_INITIALIZER; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void *consumer(void *p) { struct msg *mp; for (;;) { pthread_mutex_lock(&lock); /* pthread_cond_wait(&has_product, &lock); * 1.阻塞等待has_product被唤醒, * 2.释放互斥锁, pthread_mutex_unlock(&lock) * 3.当被唤醒时,解除阻塞,并且重新去申请获得互斥锁 pthread_mutex_lock(&lock) */ while (head == NULL) pthread_cond_wait(&has_product, &lock); mp = head; head = mp->next; pthread_mutex_unlock(&lock); printf("Consume %d\n", mp->num); free(mp); sleep(rand() % 5); } } void *producer(void *p) { struct msg *mp; for (;;) { mp = (struct msg *)malloc(sizeof(struct msg)); mp->num = rand() % 1000 + 1; printf("Produce %d\n", mp->num); pthread_mutex_lock(&lock); mp->next = head; head = mp; pthread_mutex_unlock(&lock); /* pthread_cond_broadcast(&has_product)唤醒等待队列上的所有线程*/ //发送信号,告诉消费者有产品了 pthread_cond_signal(&has_product); sleep(rand() % 5); } } int main(int argc, char *argv[]) { pthread_t pid, cid; srand(time(NULL)); pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); return 0; } |
运行结果:
总结:从上面可以看出,消费者总是消费最先生产出来的一个。
3线程同步:条件变量相关推荐
- 线程同步--条件变量
条件变量可以说是线程同步中运用最多的方式.最常见的是运用在消费者-生产者模型中. 一般由一个线程充当生产者,一个线程充当生产者.消费者需要等到足够量的数据才来消耗数据.在这中间生产者产生数据,并在数据 ...
- Linux多线程开发-线程同步-条件变量pthread_cond_t
1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...
- java线程同步——条件对象+synchronized 关键字
[0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...
- Java线程-线程池-条件变量
条件变量是Java5线程当中很重要的一个概念,顾名思义,条件变量就是条件当中的一种变量,这里的条件没有实际意义,仅仅是个标记而已. 条件变量都实现了java.util.concurrent.locks ...
- C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
作者Danny Kalev 是通过以色列系统分析师协会认证的系统分析师, 并且是专攻C++的软件工程师. Kalev 写了多本C++的书籍,同时给不同的软件开发者站点投搞C++文章. 他是C++标准委 ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- 线程的条件变量(cond)
条件变量的介绍 条件变量是线程另一可用的同步机制.条件变量给多个线程提供了一个会合的场所.条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生. 条件本身是由互斥量保护的.线程在改变条 ...
- Linux多线程同步------条件变量
先来看下<Linux高性能服务器编程>中对条件变量的描述: 上述话可以总结为: 多线程中某一个线程依赖于另外一个线程对共享数据的改变时,就可以使用条件变量! 用消费者生产者的来理解条件变量 ...
- [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
1 条件变量的信号丢失 1.1 条件变量的信号丢失场景重现 拿生产者和消费者模型举例,看一段示例代码: #include <iostream> #include <vector> ...
- Linux系统编程38:多线程之什么是线程同步以及条件变量函数
文章目录 (1):什么是线程的同步 (2):实现线程同步-条件变量函数 (1):什么是线程的同步 假如有一片临界资源,线程A和B都会修改它,为了保护资源所以要加锁,此时它们之间是互斥的关系.在我们的代 ...
最新文章
- 深度学习100例-生成对抗网络(DCGAN)生成动漫人物 | 第20天
- 音视频技术开发周刊 67期
- 2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...
- 解决VS.NET 里Atuomation 服务器不能创建对象
- init 0 init1 init 3 init 5 init 6 这几个启动级别都代表什么意思
- spring和spring_Spring MVCGradle
- Q122:PBRT-V3,提高Monte Carlo积分计算效率的方法——Russian Roulette和Splitting(13.7章节)
- 查不到元素_浓重中国元素游戏的本地化地狱
- 每周荐书:SLAM、Vue2、爬虫(评论送书)
- 孙鑫VC学习笔记:第十讲画图 创建设置画笔的对话框 并且可以预览效果
- 【三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 1260期】
- [HTTP权威指南]2.HTTP连接管理
- 2022年最新宁夏机动车签字授权人模拟试题及答案
- 使用LocalDate, LocalTime 和 LocalDateTime
- 企业邮箱怎样申请注册?
- 流量矩阵常见的两种估计方法对比
- mq中消息消费的几种方式
- 《神经科学:探索脑》学习笔记(第3章 静息态的神经元膜)
- 小程序前端view内容重叠问题
- 《R语言入门与实践》学习笔记二(chapter4~6)
热门文章
- MyBatis全局配置文件介绍
- Java 设计模式之模板方法模式
- boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
- Boost.Signals2 的多槽 hello world 示例
- boost::multiprecision模块cpp_dec_float_100相关的测试程序
- boost::math::acosh用法的测试程序
- boost::hana::Comparable用法的测试程序
- GDCM:gdcm::Tag的测试程序
- VTK:InfoVis之SCurveSpline
- VTK:图片之ImageHybridMedian2D