生产者与消费者问题(C语言 超详细全)小白可入

2023-05-16

#include<stdio.h>
#include<pthread.h>//pthread_create()函数的头文件
#include<windows.h>//sleep的头文件 
#define N 10
#define true 1 
#define sleepTime 1000//1000就是1S
#define producerNum 4
#define consumerNum 3 
typedef int semaphore;
typedef int item;
item buffer[N]={0};//缓冲池的情况 
int in=0;//生产者的指针
int out=0;//消费者的指针
semaphore mutex=1;//互斥性信号量 
semaphore empty=N;//空着的缓冲区数 
semaphore full=0;//有东西的缓冲区数
void *producer(void *a)
{
	while(true)
	{
		while(empty<=0)
		{
			printf("缓冲区已满!\n");
		}
		empty--;//执行P操作
		
		while(mutex<=0);//判断是否能进入缓冲区(mutex=1可入)
		mutex--;//进行P操作
		
		buffer[in]=1;//生产完缓冲区设置为1
		in=(in+1)%N;//是环形存储为了防止出现假溢出的现象
		
		mutex++;//执行V操作 
		full++;//上下两步可调整先后
		Sleep(sleepTime);
		//当我们设置sleep时,等于告诉cpu,当前的线程不再运行,持有当前对象的锁。
		//那么这个时候cpu就会切换到另外的线程了。这种操作有些时候是非常好的。
	}
}
void *consumer(void*b)
{
	while(true)
	{
		while(full<=0)
		{
			printf("缓冲区为空!\n"); 
		}
		full--;//执行P操作 
		
		while(mutex<=0);
		mutex--;
		
		int nextc=buffer[out];
		buffer[out]=0;//消费完将缓冲区设置为0
		out=(out+1)%N;
		
		mutex++;
		empty++;
		
		printf("消费一个产品ID%d,缓冲区位置为%d\n", nextc,out);
		Sleep(sleepTime);
	}
 } 
int main()
{
	//创建进程池,就是所有进程都能放进去的一个线程组 
	pthread_t threadPool[producerNum+consumerNum];
	
	int i;
	for(i=0;i<producerNum;i++)
	{
		pthread_t temp;
		//pthread_t是一个表示线程的数据类型
		//pthread_create是用来创建线程的 
		if(pthread_create(&temp,NULL,producer,NULL)==-1)
		{
			//pthread_create的第一个参数是指向线程标识符的指针
			//第二个参数是用来设置线程的属性(一般不用设置所以一般为NULL) 
			//第三个参数是线程运行函数的起始地址(就是新建线程需要执行的函数,该函数的参数最多有 1 个(可以省略不写)) 
			//第四个参数是运行函数的参数 
			printf("ERROR, fail to create producer%d\n",i);
			exit(1);
		}
		threadPool[i]=temp;
	 }//创建生产者线程放入线程池
	 for(i=0;i<consumerNum;i++)
	 {
	 	pthread_t temp;
	 	if(pthread_create(&temp,NULL,consumer,NULL)==-1)
	 	{
	 		printf("ERROR, fail to create consumer%d\n",i);
	 		exit(1);	
		}
		threadPool[i+producerNum]=temp; 
	 }//创建消费者线程放入线程池
	 void *result;
	 for(i=0;i<producerNum+consumerNum;i++)
	 {
	 	if(pthread_join(threadPool[i],&result)==-1)
	 	{
	 		printf("fail to recollect\n");
	 		exit(1);
		 }
	 }//运行线程池
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产者与消费者问题(C语言 超详细全)小白可入 的相关文章

  • ubuntu安装原生迅雷,让下载成为简单

    今天想到电影天堂下点电影 xff0c 发现TM全都是迅雷链接 xff0c 旋风链接什么的 无奈自带的BT下载器速度又慢 xff0c 又满足不了日常的一些文件下载 于是乎google了下 xff0c 哎呀 xff0c 有个mldonkey的电
  • Android 采用fastboot刷system.img boot.img recovery.img’

    手机正常启动后 xff0c 命令行模式下输入 adb reboot bootloader 该命令会自动进入fastboot模式 接着 xff1a fastboot devices 查看是否有设备 erase 擦除的意思 xff0c 你懂得
  • Executors.newSingleThreadExecutor的一些坑

    还是直接上源码吧 public static ExecutorService newSingleThreadExecutor return new FinalizableDelegatedExecutorService new Thread
  • 学习AOP之透过Spring的Ioc理解Advisor

    本文转自 xff1a 点击打开链接 花了几天时间来学习Spring xff0c 突然明白一个问题 xff0c 就是看书不能让人理解Spring xff0c 一方面要结合使用场景 xff0c 另一方面要阅读源代码 xff0c 这种方式理解起来
  • 计算广告资料汇总

    papers 计算广告论文 学习资料 业界分享 王喆Paper Collection of Real Time Bidding Weinan Zhang计算广告干货整理 雪伦 在线课程 Introduction to Computation
  • 编辑器之神-vim的使用技巧

    vim VS emacs vim被誉为编辑器之神 xff0c 而emacs被誉为神之编辑器 中国文化博大精深 xff0c 他们究竟有什么区别呢 xff1f 作为emacs小白的我来说不想在这里献丑 xff0c 直接贴上一篇博客 xff0c
  • Linux离线环境安装bzip2

    1 下载离线安装包 bzip2 1 0 6 13 el7 x86 64 rpm http mirror centos org centos 7 os x86 64 Packages bzip2 1 0 6 13 el7 x86 64 rpm
  • Vivado使用与注意事项

    作者 QQ群 xff1a 852283276 微信 xff1a arm80x86 微信公众号 xff1a 青儿创客基地 B站 xff1a 主页 https space bilibili com 208826118 DRC INBB 3 Bl
  • Android Beam 详细实现步骤

    前言 最近没怎么写东西了 xff0c 主要是在了解Beam这个东东 找到一些高手写的文章 xff0c 奈何水平有限看的云里雾里的 没办法 xff0c 只好去复习官方文档 正文 xff1a 先摘取一部分官方文档 xff1a Beaming N
  • Qt中UTF-8转Unicode

    include lt QtCore QCoreApplication gt include lt QDebug gt include lt iostream gt include lt QTextCodec gt int main int
  • Qt中unicode转utf-8

    最经在研究AT指令接受短信 xff0c 短信是unicode编码 xff0c 接受后需要根据系统的编码方案进行相关的转码 比如接受到了一串字符4F60597D xff0c 它是 你好 的unicode编码 xff0c 一个unicode编码
  • 移植qt5.3.1到arm

    最近刚入手一款开发板 比较低端 刚毕业工作还没一个月 穷屌丝一个 在学校以前都是用的是Friendly Arm的6410 使用的qt版本是使用的最多的4 7 0版本 入手的板子是4 7 4 qt5出来也有好长的时间了 其中提供了很多的特性
  • Linux下生产者与消费者的线程实现

    代码见 现代操作系统 第3版 为了显示效果 xff0c 添加了printf 函数来显示运行效果 1 include lt stdio h gt 2 include lt pthread h gt 3 define MAX 20 4 pthr
  • 基于TCP协议的视频传输

    这个程序是为了大二上学期一个设计作业 xff0c 写的太水 xff0c 之前也发过 xff0c 那个不是最新版 xff0c 这个找到了可能是最新版的 xff0c 昨晚调试了下 xff0c 没用 xff0c 是一个itcol的函数操作无效 x
  • 使用nginx作为websocket的proxy server

    WebSocket WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择 其为HTML5的一部分 WebSocket相较于原来开发这类app的方法来说 其能使开发更加地简单 大部分现在的浏览器都支持Web
  • 前后端分离开发部署模式

    身体出了点小毛病 xff0c 这周基本在家养病 xff0c 转文章一篇 xff0c 以激励学习 在开始讨论这个话题之前我们先来认识一下传统的开发模式 一 传统开发模式 相信很多做过Web开发童鞋应该都会经历这样一种开发模式 xff0c 利用
  • I2C总线协议

    毕业设计中使用到了AT24C04器件 xff0c 其是Ateml公司出品的 xff0c 是一种低功耗CMOS串行EEPROM xff0c 其使用两线串行的总线和控制器进行通讯 其内部保存的数据在掉电的情况下可以有40年以上的有效期 其采用8
  • Spark--用Java开发微服务

    这个说的Spark不是apache的Spark xff0c 这边说的是一个java的web application的框架 官网 http sparkjava com 我做过一段时间的后台架构开发 xff0c 使用的是微服务架构 xff0c
  • MQTT协议与mosquitto的安装使用

    MQTT xff08 Message Queuing Telemetry Transport xff0c 消息队列遥测传输 xff09 是一种标准化的发布 订阅消息传输协议 它是一种非常轻量级的协议 xff0c 由于对带宽需求很低 xff0
  • Linux 文件锁

    在文已经共享的情况下如何操作 xff0c 也就是当多个进程同时操作同一个文件时 xff0c 我们怎么保证文件数据的正确性 linux通常采用的方法是文件上锁 xff0c 来避免共享资源的产生竞争状态 文件锁包括建议性锁和强制性的锁 建议性的

随机推荐