生产者消费者条件变量模型
线程同步典型的案例即为生产者消费者模型,而借助条件变量来实现这一模型,是比较常见的一种方法。假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(一般称之为汇聚),生产向其中添加产品,消费者从中消费掉产品。
#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
生产者消费者条件变量模型相关推荐
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- 线程同步之 生产者消费者模型详解
前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先 ...
- linux多线程之条件变量
1.条件变量概述: 条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用.条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以 ...
- 条件变量存在的陷阱、生产者与消费者模型
一.条件变量的使用 Linux下条件变量相关的API如下: pthread_cond_init:用于初始化条件变量. pthread_cond_destory:销毁条件变量. pthread_cond ...
- [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )
文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...
- < Linux > 多线程(生产者消费者模型)
目录 1.生产者消费者模型 生产者消费者模型的例子 生产者消费者模型的特点 生产者消费者模型的优点 2.基于BlockingQueue的生产者消费者模型 概念 模拟实现基于阻塞队列的生产消费模型 基于 ...
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- java多线程之~生产者消费者
文章目录 一.怎样使用多线程 二.生产者消费者 一.怎样使用多线程 一般来讲我们创建多线程的方式有一下几种: 1. 实现Runnable接口 并重写其中的run方法 2. 继承Thread类,重写ru ...
最新文章
- 用pip安装tensorflow报错SyntaxError: invalid syntax
- 【分享】扎克伯格的26条提升效率点子
- 秒杀多线程第五篇 经典线程同步 关键段CS
- (19)FPGA乒乓操作
- 规则引擎--规则引擎构成重点
- dnf连不上服务器删什么文件,DNF客户端又出问题?其实是这个文件惹的祸,删除就好了!...
- 创意水彩中国风重阳节PPT模板
- linux yml文件格式,YML 文件扩展名: 它是什么以及如何打开它?
- 【Android 性能优化】应用启动优化 ( 主题背景图片设置 | 设置透明主题背景 | 设置应用启动主题背景、启动后恢复主题 )
- windows系统设置保护视力方法
- Hadoop研发工程师_岗位职责和技能要求
- 硬盘MBR格式转换GPT
- 抖音多闪数次声明被打脸 法院正式裁定抖音违规
- 加菲猫经典语录(二十二条,中英文对照)
- Node的文件系统及Buffer概述
- webview加载gif图片
- Scala Case Class介绍
- 记事本文档转成excel
- 会声会影2023旗舰版中文版永久功能使用技巧说明
- 有些句子,比人还美!真的