首先介绍一下条件变量


下面用条件变量来实现生产者-消费者模型

大体思路如下:生产者为链表“生产”结点,消费者“消费”结点,如果链表中没有结点,则阻塞消费者线程

#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;
}

结果如下:

用条件变量实现生产者-消费者模型相关推荐

  1. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  2. 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  3. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

  4. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  5. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  6. 【操作系统/OS笔记13】信号量、PV操作、管程、条件变量、生产者消费者问题

    本次笔记内容: 10.1 背景 10.2 信号量 10.3 信号量的使用 10.4 信号量的实现 10.5 管程 文章目录 信号量的提出背景 信号量(semaphore) 信号量数据类型 信号量类似铁 ...

  7. 利用互斥锁和条件变量实现生产者消费模型

    以下内容全部来自于自旋锁_哔哩哔哩_bilibili #include <stdio.h> #include <pthread.h> #include <stdlib.h ...

  8. 条件变量(生产者消费者问题)

    问题描述 生产者消费者问题:(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...

  9. 操作系统:生产者消费者模型的两种实现(C++)

    文章目录 生产者消费者模型 什么是生产者消费者模型 生产者消费者模型的321原则 生产者消费者模型的优点 生产者消费者模型的实现方法 基于循环队列,信号量实现 基于阻塞队列,互斥锁.条件变量实现 生产 ...

最新文章

  1. 如何动态合并两个JavaScript对象的属性?
  2. 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用23
  3. python中eval与json.loads对json的处理
  4. 从一个路口转向另一个路口需要多少步
  5. 计算机视觉与深度学习算法工程师面试题整理
  6. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
  7. 关于方法论的对话之二敏捷与方法论
  8. 5.2 感知机和多层网络
  9. 单片机c语言正弦计算器,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  10. 公用计算机管理,如何管理公用计算机和私人计算机的文件访问
  11. Pixel 值得购买么?
  12. Linux内核模块静态加载的顺序
  13. 柯美6501服务器显示AA,柯美6501维修手册全_Part1 (2).pdf
  14. 生物化学《第一章概述》
  15. python 解决爬虫得到诸如\u65e2 unicode码转中文和字符串转json的问题
  16. Emacs是一种信仰!世界最强编辑器介绍
  17. 魔性计时器html6,最近抖音很火的6首BGM,太有魔性了!
  18. 美团{青龙面板可跑项目之一}保姆教程
  19. zigbee终端入网
  20. 字母数字特殊字符部分unicode对照表

热门文章

  1. 护卫神主机大师或者是主机管理系统中创建网站时提示开设失败的解决办法
  2. 领英退出中国关闭领英职场后,怎么继续使用原有的领英账号联系开发客户?
  3. 面试官:说说new操作符具体都干了什么?
  4. BAT文件语法和技巧(bat文件的编写及使用)(转载一)
  5. 广域网技术PPP、PPPoE、MPLS、SR(分段路由技术)(HCIA)
  6. Anchorfree Hotspot Shield 去广告方法
  7. Makefile中的filter函数
  8. BruteXSS漏洞测试工具
  9. 把U盘格式化成NTFS和FAT32有什么不同?
  10. selenium和phantomJS