线程同步典型的案例即为生产者消费者模型,而借助条件变量来实现这一模型,是比较常见的一种方法。假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(一般称之为汇聚),生产向其中添加产品,消费者从中消费掉产品。

#include <stdlib.h>
#include <unistd.h>
#include <pthread.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);       //加锁 互斥量while (head == NULL) {           //头指针为空,说明没有节点    可以为if吗pthread_cond_wait(&has_product, &lock);  //阻塞等待条件变量 解锁}   //pthread_cond_wait 返回时,重新加锁lockmp = head;      head = mp->next;                //模拟消费掉一个产品pthread_mutex_unlock(&lock);    //解锁互斥量printf("-Consume ---%d\n", mp->num);free(mp);sleep(rand() % 5);}return NULL;
}void *producer(void *p)
{struct msg *mp;while (1) {mp = 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_signal(&has_product);  //将等待在该条件变量上的一个线程唤醒sleep(rand() % 5);}return NULL;
}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;
}                                       【conditionVar_product_consumer.c】

https://www.bilibili.com/video/BV1KE411q7ee?p=177&spm_id_from=pageDriver&vd_source=d239c7cf48aa4f74eccfa736c3122e65

生产者消费者条件变量模型相关推荐

  1. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  2. 线程同步之 生产者消费者模型详解

    前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先 ...

  3. linux多线程之条件变量

    1.条件变量概述: 条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用.条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以 ...

  4. 条件变量存在的陷阱、生产者与消费者模型

    一.条件变量的使用 Linux下条件变量相关的API如下: pthread_cond_init:用于初始化条件变量. pthread_cond_destory:销毁条件变量. pthread_cond ...

  5. [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

    文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...

  6. < Linux > 多线程(生产者消费者模型)

    目录 1.生产者消费者模型 生产者消费者模型的例子 生产者消费者模型的特点 生产者消费者模型的优点 2.基于BlockingQueue的生产者消费者模型 概念 模拟实现基于阻塞队列的生产消费模型 基于 ...

  7. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  8. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  9. java多线程之~生产者消费者

    文章目录 一.怎样使用多线程 二.生产者消费者 一.怎样使用多线程 一般来讲我们创建多线程的方式有一下几种: 1. 实现Runnable接口 并重写其中的run方法 2. 继承Thread类,重写ru ...

最新文章

  1. 用pip安装tensorflow报错SyntaxError: invalid syntax
  2. 【分享】扎克伯格的26条提升效率点子
  3. 秒杀多线程第五篇 经典线程同步 关键段CS
  4. (19)FPGA乒乓操作
  5. 规则引擎--规则引擎构成重点
  6. dnf连不上服务器删什么文件,DNF客户端又出问题?其实是这个文件惹的祸,删除就好了!...
  7. 创意水彩中国风重阳节PPT模板
  8. linux yml文件格式,YML 文件扩展名: 它是什么以及如何打开它?
  9. 【Android 性能优化】应用启动优化 ( 主题背景图片设置 | 设置透明主题背景 | 设置应用启动主题背景、启动后恢复主题 )
  10. windows系统设置保护视力方法
  11. Hadoop研发工程师_岗位职责和技能要求
  12. 硬盘MBR格式转换GPT
  13. 抖音多闪数次声明被打脸 法院正式裁定抖音违规
  14. 加菲猫经典语录(二十二条,中英文对照)
  15. Node的文件系统及Buffer概述
  16. webview加载gif图片
  17. Scala Case Class介绍
  18. 记事本文档转成excel
  19. 会声会影2023旗舰版中文版永久功能使用技巧说明
  20. 有些句子,比人还美!真的

热门文章

  1. 港股交易软件怎么用?需要学习哪些港股交易基本规则?
  2. Tableau 超市经典案例之利润分析(二)
  3. 任务,责任,过错之间的平衡问题
  4. Android学习记录(一)
  5. python开发windows界面_pyui4win
  6. WebRTC 核心功能介绍--一篇读懂SDP PlanB UnifiedPlan(从PlanB迁移到UnifiedPlan)
  7. 大学四年,适当孤独比盲目合群更舒服
  8. IIS 绑定多个证书错误解决方法
  9. jpa mysql boolean_jpa中boolean型属性映射的问题
  10. 训练营第一天学习笔记