用条件变量实现生产者-消费者模型
首先介绍一下条件变量
下面用条件变量来实现生产者-消费者模型
大体思路如下:生产者为链表“生产”结点,消费者“消费”结点,如果链表中没有结点,则阻塞消费者线程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#include <ctime>pthread_mutex_t mutex;
pthread_cond_t cond;struct Node{int val;Node* next;Node(int _val): val(_val), next(NULL){}
};Node* head;void Print(Node* h) {while (h) {printf("%d->", h->val);h = h->next;}printf("\n");
}void* producer(void* argc) {srand(time(NULL));while (1) {int val = rand() % 10;Node* cur = new Node(val);// 生产者开始生产结点pthread_mutex_lock(&mutex);cur->next = head;head = cur;Print(head);pthread_mutex_unlock(&mutex);// 生产者生产完后唤醒消费者pthread_cond_signal(&cond);sleep(1);} return NULL;
}void* customer(void* argc) {while (1) {pthread_mutex_lock(&mutex);if (head == NULL) { // 如果链表中还没有结点,则阻塞线程printf("wait\n");pthread_cond_wait(&cond, &mutex);} // 消费者开始消费结点Node* tmp = head;printf("tmp == %d\n", tmp->val);head = head->next;pthread_mutex_unlock(&mutex);delete tmp;sleep(2);}return NULL;
}int main() {pthread_t p1, p2; // 创建两个线程,p1作为生产者,p2作为消费者pthread_create(&p1, NULL, producer, NULL);pthread_create(&p2, NULL, customer, NULL);pthread_mutex_init(&mutex, NULL); // 初始化互斥锁pthread_cond_init(&cond, NULL); // 初始化条件变量pthread_join(p1, NULL); // 销毁两个线程pthread_join(p2, NULL);pthread_mutex_destroy(&mutex); // 销毁互斥锁pthread_cond_destroy(&cond); // 销毁条件变量return 0;
}
结果如下:
用条件变量实现生产者-消费者模型相关推荐
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- 【操作系统/OS笔记13】信号量、PV操作、管程、条件变量、生产者消费者问题
本次笔记内容: 10.1 背景 10.2 信号量 10.3 信号量的使用 10.4 信号量的实现 10.5 管程 文章目录 信号量的提出背景 信号量(semaphore) 信号量数据类型 信号量类似铁 ...
- 利用互斥锁和条件变量实现生产者消费模型
以下内容全部来自于自旋锁_哔哩哔哩_bilibili #include <stdio.h> #include <pthread.h> #include <stdlib.h ...
- 条件变量(生产者消费者问题)
问题描述 生产者消费者问题:(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...
- 操作系统:生产者消费者模型的两种实现(C++)
文章目录 生产者消费者模型 什么是生产者消费者模型 生产者消费者模型的321原则 生产者消费者模型的优点 生产者消费者模型的实现方法 基于循环队列,信号量实现 基于阻塞队列,互斥锁.条件变量实现 生产 ...
最新文章
- 如何动态合并两个JavaScript对象的属性?
- 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用23
- python中eval与json.loads对json的处理
- 从一个路口转向另一个路口需要多少步
- 计算机视觉与深度学习算法工程师面试题整理
- 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
- 关于方法论的对话之二敏捷与方法论
- 5.2 感知机和多层网络
- 单片机c语言正弦计算器,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
- 公用计算机管理,如何管理公用计算机和私人计算机的文件访问
- Pixel 值得购买么?
- Linux内核模块静态加载的顺序
- 柯美6501服务器显示AA,柯美6501维修手册全_Part1 (2).pdf
- 生物化学《第一章概述》
- python 解决爬虫得到诸如\u65e2 unicode码转中文和字符串转json的问题
- Emacs是一种信仰!世界最强编辑器介绍
- 魔性计时器html6,最近抖音很火的6首BGM,太有魔性了!
- 美团{青龙面板可跑项目之一}保姆教程
- zigbee终端入网
- 字母数字特殊字符部分unicode对照表