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>

函数原形:

int pthread_cond_init(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

参数:

返回值:

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线程同步:条件变量相关推荐

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

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

  2. Linux多线程开发-线程同步-条件变量pthread_cond_t

    1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...

  3. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

  4. Java线程-线程池-条件变量

    条件变量是Java5线程当中很重要的一个概念,顾名思义,条件变量就是条件当中的一种变量,这里的条件没有实际意义,仅仅是个标记而已. 条件变量都实现了java.util.concurrent.locks ...

  5. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数

    作者Danny Kalev 是通过以色列系统分析师协会认证的系统分析师, 并且是专攻C++的软件工程师. Kalev 写了多本C++的书籍,同时给不同的软件开发者站点投搞C++文章. 他是C++标准委 ...

  6. java线程条件变量_多线程同步条件变量(转载)

    最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...

  7. 线程的条件变量(cond)

    条件变量的介绍 条件变量是线程另一可用的同步机制.条件变量给多个线程提供了一个会合的场所.条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生. 条件本身是由互斥量保护的.线程在改变条 ...

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

    先来看下<Linux高性能服务器编程>中对条件变量的描述: 上述话可以总结为: 多线程中某一个线程依赖于另外一个线程对共享数据的改变时,就可以使用条件变量! 用消费者生产者的来理解条件变量 ...

  9. [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】

    1 条件变量的信号丢失 1.1 条件变量的信号丢失场景重现 拿生产者和消费者模型举例,看一段示例代码: #include <iostream> #include <vector> ...

  10. Linux系统编程38:多线程之什么是线程同步以及条件变量函数

    文章目录 (1):什么是线程的同步 (2):实现线程同步-条件变量函数 (1):什么是线程的同步 假如有一片临界资源,线程A和B都会修改它,为了保护资源所以要加锁,此时它们之间是互斥的关系.在我们的代 ...

最新文章

  1. 深度学习100例-生成对抗网络(DCGAN)生成动漫人物 | 第20天
  2. 音视频技术开发周刊 67期
  3. 2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...
  4. 解决VS.NET 里Atuomation 服务器不能创建对象
  5. init 0 init1 init 3 init 5 init 6 这几个启动级别都代表什么意思
  6. spring和spring_Spring MVCGradle
  7. Q122:PBRT-V3,提高Monte Carlo积分计算效率的方法——Russian Roulette和Splitting(13.7章节)
  8. 查不到元素_浓重中国元素游戏的本地化地狱
  9. 每周荐书:SLAM、Vue2、爬虫(评论送书)
  10. 孙鑫VC学习笔记:第十讲画图 创建设置画笔的对话框 并且可以预览效果
  11. 【三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 1260期】
  12. [HTTP权威指南]2.HTTP连接管理
  13. 2022年最新宁夏机动车签字授权人模拟试题及答案
  14. 使用LocalDate, LocalTime 和 LocalDateTime
  15. 企业邮箱怎样申请注册?
  16. 流量矩阵常见的两种估计方法对比
  17. mq中消息消费的几种方式
  18. 《神经科学:探索脑》学习笔记(第3章 静息态的神经元膜)
  19. 小程序前端view内容重叠问题
  20. 《R语言入门与实践》学习笔记二(chapter4~6)

热门文章

  1. MyBatis全局配置文件介绍
  2. Java 设计模式之模板方法模式
  3. boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
  4. Boost.Signals2 的多槽 hello world 示例
  5. boost::multiprecision模块cpp_dec_float_100相关的测试程序
  6. boost::math::acosh用法的测试程序
  7. boost::hana::Comparable用法的测试程序
  8. GDCM:gdcm::Tag的测试程序
  9. VTK:InfoVis之SCurveSpline
  10. VTK:图片之ImageHybridMedian2D