linux基于信号量实现多线程生产者消费者模型

news2024/11/19 17:37:15

基于信号量实现多线程生产者消费者模型。

编程思路:

1.食物的初始化编号为100: beginnum = 100;
2.仓库有5个空碗,最多保存5个食物:queue[5];
3.初始化空碗的数量为5,食物的数量为0:
sem_init(&sem_bowl,0,5);
sem_init(&sem_food,0,0);
4.创建生产者和消费者线程;
5.生产者通过sem_wait(&sem_bowl)函数监控空碗的数量;
6.消费者通过sem_wait(&sem_food)函数监控食物的数量;
7.由于最开始阶段空碗的数量是5,生产者线程会先执行。先通过sem_wait(&sem_bowl)函数将空碗数量减一,然后向这个碗中放入一个食物;
8.生产者每生产一个食物,会将食物的数量加一:sem_post(&sem_food);
9.系统监控到食物的数量大于0的时候,会随机唤醒一个等待的消费者线程;
10.消费者线程首先会通过sem_wait(&sem_food)函数将食物的数量减一,然后取走食物;
11.消费者线程每取走一个食物,通过sem_post(&sem_bowl)函数将空碗的数量加一;
12.由于空碗的数量最多为5,仓库里最多只能保存5个食物,sem_food信号量最大值只能到5。

代码:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#include <stdlib.h>

int beginnum = 100;
int queue[5];
sem_t sem_bowl, sem_food;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void * product_handle(void * arg) {
int i = 0;
while(1) {
sem_wait(&sem_bowl);
printf(“%s number %d\n”,FUNCTION,beginnum);
queue[(i++)%5] = beginnum++;
//printf(“%s number %d\n”,FUNCTION,beginnum);
sem_post(&sem_food);
sleep(rand()%1);
}
return NULL;
}
int i =0;
void * customer_handle(void * arg) {
while(1) {
// pthread_mutex_lock(&mutex);
sem_wait(&sem_food);
int num = queue[(i++)%5];
printf(“%ld customer number %d\n”,pthread_self(),num);
sem_post(&sem_bowl);
// pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
return NULL;
}

int main()
{
sem_init(&sem_bowl,0,5);
sem_init(&sem_food,0,0);
pthread_t pdit_product,pdit_customer[5];
pthread_create(&pdit_product,NULL,product_handle,NULL);
pthread_create(&pdit_customer[0],NULL,customer_handle,NULL);
pthread_create(&pdit_customer[1],NULL,customer_handle,NULL);

pthread_join(pdit_product,NULL);
pthread_join(pdit_customer[0],NULL);
pthread_join(pdit_customer[1],NULL);
sem_destroy(&sem_bowl);
sem_destroy(&sem_food);
pthread_mutex_destroy(&mutex);
return 0;

}

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/851894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中级课程——XSS

文章目录 介绍挖掘思路分类反射型存储型dom类型 介绍 挖掘思路 注入点&#xff1a;各种输入框 测试代码&#xff08;poc&#xff09;&#xff1a;js语句 分类 反射型 存储型 dom类型

势不可挡!新能源车型L2搭载率破50%,TOP20品牌数据出炉

中国乘用车市场正在走出去年的阴霾。 机构公开数据显示&#xff0c;2023年上半年中国乘用车市场产量1100.77万辆&#xff0c;同比增长7.5%&#xff1b;终端销量959.08万辆&#xff0c;同比增长4.7%&#xff1b;乘用车出口152.36万辆&#xff0c;同比增长87.6%。 在实际交付量…

[HDLBits] Exams/m2014 q4g

Implement the following circuit: module top_module (input in1,input in2,input in3,output out);assign out (!(in1^in2))^in3; endmodule

Java EE 突击 9 - Spring Boot 日志文件

Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…

【Linux 网络】NAT技术——缓解IPv4地址不足

NAT技术 NAT 技术背景NAT IP转换过程NAPTNAT 技术的缺陷 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&#xff0c;是解决IP地址不足的主要手段&#xff0c;并且能够有效地避免来自网络外部的攻击&#xff0c;隐藏并保护网络内部的计算…

爬虫程序中使用爬虫ip的优势

作为一名爬虫技术员&#xff0c;我发现在爬虫程序中使用代理IP可以提升爬取效率和匿名性。今天&#xff0c;我就来详细讲解一下代理IP在爬虫程序中的工作原理及应用。 首先&#xff0c;我们来了解一下代理IP在爬虫程序中的工作原理。当我们使用爬虫程序进行数据采集时&#xf…

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Android 开发者选项日志存储路径

android开发者选项中存在两个item是关于系统日志的。 1.日志记录器缓冲区大小 2.在设备上永久存储日志记录器数据 一个是用来设置缓冲区大小&#xff0c;一个是用来日志存储开关及过滤。 通过分析 system/core/logcat/logcatd.rc mkdir /data/misc/logd 0770 logd log 日志的…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-01入门&#xff09; 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

keil5 watch数据一直为0不显示

调试遇到一个问题&#xff0c;以为是指针里面的数据&#xff0c;数组显示不出来&#xff0c;结果是main函数里面有个1s的延时&#xff0c;我的理解是watch刷新太慢了&#xff0c;一直掉进延时里面&#xff0c;所以我们把延时改到10ms就行了。

100ASK百问网 全志D1s/T113-s3开发板 适配ov5640教程

本实验采用百问网的100ASK_T113-PRO Base V1.1 &#xff0c; D1s也可以参考进行修改并适配。 本实验所需的文件&#xff08;含tina根文件系统、SD镜像、设备树、内核配置文件&#xff09;供大家对比参考&#xff1a;source.zip 1.硬件配置 查看百问网提供的T113开发板原理图1…

Vue2核心完整笔记

文章目录 [TOC](文章目录)前言1. vue2基础知识和原理1.1 初识Vue 和 Vue简介1.2 模板语法1.3 数据绑定1.4 el与data的两种写法1.5 Vue中的MVVM1.6 数据代理1.7 事件处理1.8 键盘事件1.9 计算属性1.10 监视属性1.11 绑定样式class样式style样式 1.12 条件渲染v-ifv-show 1.13 列…

echarts 图表饼状图 实例

效果图&#xff1a; 代码&#xff1a; draw(data1, data2) {var option {// backgroundColor: rgb(10,36,68),color: [#F19611 ,#0095FE,#162D86,#0096FF,#05F8FF,#FFD985,#FACDAA,#F4A49E,#EE7B91,#E85285,#BE408C,#942D93,#171E6D,#1E3388,#27539B,#3073AE,#3993C2,#42B3D…

比较IP代理与路由器获取IP地址的三大差异

在今天的文章中&#xff0c;我们将与大家一起探讨IP代理与路由器获取IP地址的差异。这两种方式在获取IP地址上有一些区别&#xff0c;而这些区别会对我们的网络使用体验产生影响。今天我们深入分析并提供一些实际的例子与操作经验。 稳定性差异&#xff1a; 通过路由器获取IP地…

STM32基于CubeIDE和HAL库 基础入门学习笔记:基础知识理论 开发环境建立

文章目录&#xff1a; 一&#xff1a;开发板和基础知识理论 1.开发板 2.基础知识理论* 二&#xff1a;CubeMX图形化编程 1.设置时钟&#xff08;心脏&#xff09; 1.1 开启RCC功能 1.2 开启RTC功能 1.3 配置时钟树 2.设置端口&#xff08;五官四肢&#xff09; 3.工…

Shopee、国际站卖家测评自养号方法大揭秘!

很多虾皮卖家都会经常提到“权重”这个词语&#xff0c;什么是权重&#xff1f;权重的作用是什么&#xff1f;如何提高产品的权重&#xff1f;今天就带大家来仔细了解下这个“权重”。 什么是权重&#xff1f; 权重泛指某一因素或指标相对于某一事物的重要程度。而Shopee权重…

由 Base64 展开的知识探讨

前言 在我们的业务应用中越来越多的应用到编码内容&#xff0c;例如在 API 中&#xff0c;给到后端的 SQL 都是通过 Base64 加密的数据等等。 能够发现我们的代码中&#xff0c;使用的 window 对象上的 btoa 方法实现的 Base64 编码&#xff0c;那 btoa 具体是如何实现的呢&a…

第二篇|研究数据哪里来——建筑业

数据是研究和产业发展的重要基石&#xff0c;然而无论是学者、企业还是研究机构往往都面临着“找数据难”的局面。本期将分享一些查找建筑相关的数据及资料的渠道。希望可以帮大家解决这一难题&#xff0c;有用求收藏求收藏求收藏~ 1.政府机构 可以查找国家、地方政府的建筑行…

应用在室外LED电子显示屏中的MiniLED背光

LED电子显示屏是一种通过控制半导体发光二极管的显示方式&#xff0c;是由几万–几十万个半导体发光二极管像素点均匀排列组成。它利用不同的材料可以制造不同色彩的LED像素点&#xff0c;以显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。 LED显示屏…

安防监控视频汇聚EasyCVR平台的FLV视频流在VLC中无法播放的原因排查

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…