代码的关键部分是设置一个互斥量来模仿只有一个线程访问缓冲区。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>#define N 4int buf[N] = {0};//缓冲区大小为4,初始化为0,表示一开始没有产品
int putin = 0;//数据入区位置
int takeout = 0;//数据出区位置//设计信号量(信号量的大小可为>1的数)
sem_t unoccupied;//空位个数时
sem_t occupied;//产品各数//设置互斥量(互斥量的大小为0或1)
pthread_mutex_t mutex; //表示一个缓冲区,模拟操作系统只有一个线程对缓冲区访问,不能同时有多个线程访问缓冲区//设计时延函数(2层循环)
void delay (int len) {int i = rand () % len;int x;while (i > 0) {x = rand () % len;while (x > 0) {x--;}i--; }
}//设计可唤醒消费者的生产者
void producer() {while (1) {//模拟正在生产int d = 1 + rand () % 100;//代表生产的产品名字delay(50000);//生产后产品入库sem_wait(&unoccupied);//P操作,将对应的信号量unoccupied减1再与0进行比较大小,入库前判断是否有空位,有空位(比较结果>=0)则后续代码才能执行,否则阻塞当前进程//开始业务操作pthread_mutex_lock(&mutex); //加锁,当一个线程在访问缓冲区时,另一个线程来访问时被阻塞buf[putin] = d;printf("Put %d to the buffer at %d.\n",buf[putin],putin);putin++;//生产出的产品的投放顺序在缓冲区依序排放,即使前一个生产出的产品被消耗了,也是依序往后放if(putin == N) {putin = 0;//putin变为3以后自增为4的时将其置0}sem_post(&occupied);//V操作,可取物品信号量加1,唤醒pthread_mutex_unlock(&mutex); //当前线程访问完缓冲区以后解锁}
}void consumer() {while (1) {//模拟正在取物品delay(5000);//进行消费 sem_wait(&occupied);//P操作,将对应的信号量occupied减1再与0进行比较大小,消费前判断是否有产品,有产品(比较结果>=0)则后续代码才能执行,否则阻塞当前进程pthread_mutex_lock(&mutex); printf("Take out %d from the buffer at %d.\n",buf[takeout],takeout);buf[takeout] = -1; takeout++;if (takeout == N) {takeout = 0;}sem_post(&unoccupied);//V操作,可生产空位信号量加1pthread_mutex_unlock(&mutex); }
}int main () {srand(time(NULL));//声明厂家消费者线程pthread_t manufacturer;pthread_t customer;//初始化信号量sem_init(&unoccupied, 0, N);sem_init(&occupied, 0, 0);//初始化互斥量pthread_mutex_init(&mutex, NULL); //创建线程pthread_create(&manufacturer, NULL, (void *)producer, NULL);pthread_create(&customer, NULL, (void *)consumer, NULL);//阻塞当前线程,直到这两个线程执行结束pthread_join(manufacturer, NULL);pthread_join(customer, NULL);//撤销信号量sem_destroy(&unoccupied);sem_destroy(&occupied);return 0;
}

C语言多线程之生产者消费者问题相关推荐

  1. Linux下实现多线程的生产者消费者问题

    Linux下实现多线程的生产者消费者问题 一.原理的理解 生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个线程地址空间内执行的两个线程 ...

  2. python多线程实现生产者消费者_用Python实现多线程“生产者-消费者”模型的简单例子...

    用 Python 实现多线程"生产者 - 消费者"模型的简单例子 生产者消费者问题是一个著名的线程同步问题, 该问题描述如下: 有一个生产者在生产产品, 这些产品将提供给若干个消费 ...

  3. C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)

    前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题--生产者消费者模型,并给出 ...

  4. 多线程实现生产者消费者

    1. Python多线程介绍 Python提供了两个有关多线程的标准库,thread和threading.thread提供了低级别的,原始的线程和一个锁.threading则是一个高级模块,提供了对t ...

  5. java多线程之生产者消费者问题

    今天研究了一下Java多线程,根据老师上课讲的和写的,自己写了一下多线程中的经典问题-----生产者消费者经典问题, package producerconsumer; public class Pr ...

  6. 多线程之生产者消费者模型

    生产者消费者模型 1.为什么要使用生产者和消费者模式 2.案例 1.为什么要使用生产者和消费者模式 在线程开发中,生产者就是生产线程的线程,消费者就是消费线程的线程.在多线程开发中,如果生产者如理数据 ...

  7. 爬虫--05:多线程与生产者消费者模型

    Crawler - 05: Multithreading- und Produzenten-Verbrauchermodell 多线程 一.多线程的基本介绍 1.介绍 2.程序中模拟多任务 二.创建多 ...

  8. Linux多线程实现生产者消费者进程(Linux+window代码)

    原文链接:我的个人链接 Linux 常用多线程函数 pthread_create():创建一个线程 pthread_exit():退出一个线程 pthread_jion():阻塞当前线程,直到另一个线 ...

  9. 多线程设计模式:生产者-消费者

    一.两个线程一个生产者一个消费者 需求情景 – 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个. 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法 ...

最新文章

  1. java集合框架图(二)
  2. Linux 系统目录结构
  3. python flask 大文件 下载_flask - python上传大文件到服务器报错
  4. python冒泡排序实验报告_python中的冒泡排序
  5. 抛砖引玉,终于完成了自己的客户端校验提示Extender
  6. 我的世界服务器自定义怪物怎么用,我的世界怪物属性自定义教程 怪物属性代码一览...
  7. java小球游戏项目实战
  8. ruby+gem常用命令
  9. 解数独(Python)
  10. python处理HTML的函数库,【整理】关于Python中的html处理库函数BeautifulSoup使用注意事项...
  11. MySQL详细学习教程(建议收藏)
  12. C中printf()的常用输出
  13. 使用Ajax进行前后端交互(一)
  14. 五句话介绍计算机英语,日常必备的英语口语句子3篇
  15. 浅谈工作流技术及其应用
  16. QPainter绘制文本 二
  17. 快速学完计算机网络,如何让电脑网速变快 5分钟就学会
  18. 扫雷游戏开发基本思路
  19. 网络层(2.网际协议IP)
  20. JAVA开发运维(nginx工作原理)

热门文章

  1. php上传进度条问题,php上传进度条
  2. 软件生命周期的六个阶段
  3. Alibaba出品Java性能优化高级笔记(全彩版)震撼来袭
  4. 视觉SLAM笔记(35) 三角化求特征点的空间位置
  5. 用面对对象的方式点击表头排序
  6. 我用血和泪的教训,再次告诉你:不要接私活
  7. iOS App 上架流程图文教学
  8. 戴尔成铭3980商务机(硬盘保护状态下)CMOS电池缺电与处理
  9. python海象运算符_Python 中海象运算符的三种用法
  10. 第12周任务2(分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部))