linux 多线程信号量(生产者消费者问题)

操作系统实验题目之进程间通信(含c语言代码) 编写server和client两个程序,利用命名管道实现两个进程间的消息互通。 解答: 源代码 Server.c: Client.c 运行截图 使用多线程和信号量解决生产者/消费者问题:有一个长度为N的缓冲池被生产者和消费者共同使用。只要缓冲池未满,生产者就可以将消息送入缓冲池;只要缓冲池不空,消费者便可从缓冲池中取走一个消息。生产者向缓冲池放入消息的同时,消费者不能操作缓冲池,反之亦然。 解答: 源代码 #include <pthread.h> #include <std. 阅读详情
  • 生产者消费者问题

这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

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

sem_t sem_product;      // 产品信号量
sem_t sem_space;        // 仓库容量信号量

typedef struct{
    int space;
    int product;
}pd_sp_def;

pd_sp_def pd_sp;

void* pth_consume(void* arg)
{
    char* name = (char*)arg;
    int cnt;

    while (1)
    {
        //对产品个数减一
        sem_wait(&sem_product);
        pd_sp.product--;
        pd_sp.space++;
        printf("consume %s space:%d, product=%d\n",name,pd_sp.space, pd_sp.product);

        //相应的空间加一
        sem_post(&sem_space);
        sem_getvalue(&sem_product, &cnt);
        //printf("Csm Thread %s consume, count:%d\n", name, , cnt);
        sleep(2);   // 每隔2S消费一个产品
    }

    pthread_exit(0);
}

void* pth_product(void* arg)
{
    char* name = (char*)arg;
    int cnt;

    while (1)
    {
        //刚开始空间是5,空间减一
        sem_wait(&sem_space);
        pd_sp.product++;
        pd_sp.space--;
        printf("product %s space:%d, product=%d\n",name,pd_sp.space, pd_sp.product);
        //产品生产加一
        sem_post(&sem_product);
        sem_getvalue(&sem_product, &cnt);
        //printf("pro Thread %s product, count:%d\n", name, cnt);

        sleep(1);   // 每隔1S生产一个产品
    }

    pthread_exit(0);
}

int main()
{
    pthread_t tid1, tid2, tid3, tid4;
    
    int ret;
    pd_sp.space = 5;
    pd_sp.product = 0; 
    // 初始化信号量
    sem_init(&sem_product, 0, 0);   // 初始状态产品个数为0
    sem_init(&sem_space, 0, 5);     // 初始状态仓库空间为5

    ret = pthread_create(&tid1, NULL, pth_product, "A");
    if (0 != ret)
    {
        perror("create pthead error");
        return -1;
    }

    ret = pthread_create(&tid2, NULL, pth_product, "B");
    if (0 != ret)
    {
        perror("create pthead error");
        return -1;
    }

    ret = pthread_create(&tid3, NULL, pth_consume, "C");
    if (0 != ret)
    {
        perror("create pthead error");
        return -1;
    }

    ret = pthread_create(&tid4, NULL, pth_consume, "D");
    if (0 != ret)
    {
        perror("create pthead error");
        return -1;
    }

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);
    pthread_join(tid4, NULL);

    // 销毁信号量
    sem_destroy(&sem_product);
    sem_destroy(&sem_space);

    return 0;
}





product B space:4, product=1
consume D space:5, product=0
product A space:4, product=1
consume C space:5, product=0
product B space:4, product=1
product A space:3, product=2
product B space:2, product=3
consume D space:3, product=2
consume C space:4, product=1
product A space:3, product=2
product B space:2, product=3
product A space:1, product=4
consume D space:2, product=3
product B space:1, product=4
consume C space:2, product=3
product A space:1, product=4
product B space:0, product=5
consume D space:1, product=4
product A space:0, product=5
consume C space:1, product=4
product B space:0, product=5

OS_exp3 生产者消费者问题(Linux环境) 【实验三】实验要求: 实验三、生产者消费者问题(15分) • 一个大小为3的缓冲区,初始为空 • 2个生产者 – 随机等待一段时间,往缓冲区添加数据, – 若缓冲区已满,等待消费者取走数据后再添加 – 重复6次 • 3个消费者 – 随机等待一段时间,从缓冲区读取数据 – 若缓冲区为空,等待生产者添加数据后再读取 – 重复4次 说明: • ... 阅读详情

相关推荐

PLL Performance,Simulation and Design 4th学习笔记——Chapter1

Chapter1:基本PLL概述 VCO:Voltage-Controlled Oscillator压控振荡器,对于给定的一个输入电压,输出特定频率的振荡信号。 PLL:Phase-Locked Loops锁相环,输出特定频率,特定相位的振荡信号。 基本PLL操作和术语 基本模块 基本模块 输入 输出 传输函数 说明 XTAL - 参考频率ϕref\phi_{ref}ϕref​ - 稳定的晶振提供输入参考频率(这里用相位,便于理解鉴相器) R Counter ϕref\phi_{ref

张硕的博客 1553

操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)

pc2.c: 使用信号量解决生产者、计算者、消费者问题 • 功能和前面的实验相同,使用信号量解决 实现思路: 生产者、计算者、消费者三者之间的关系和上一个编程任务一样,不一样的是,将互斥量、条件变量封装起来作为信号量,处理方式基本和上一个编程任务一样 实现代码: #include&lt;stdio.h&gt; #include&lt;pthread.h&gt; #includ...

Betterc5的博客 4841

Ansys Zemax | 公差分析中的补偿器优化:如何提升系统良率?

本文深入探讨了在Ansys Zemax公差分析中如何有效设置与优化补偿器以提升系统良率。文章指出,补偿器是连接理想设计与现实生产的关键,通过模拟实际装配中的调整(如后焦距),能显著改善公差分析的“悲观”预测。详细介绍了补偿器的添加方法、多补偿器策略、评价函数设计以及通过灵敏度分析和蒙特卡洛档案优化补偿效果,旨在帮助光学工程师制定更符合生产实际的公差策略,从而有效提升产品良率。

weixin_28419039的博客 621

用多线程实现“生产者-消费者问题”(代码+实验报告)

 用多线程实现“生产者-消费者问题”(代码+实验报告) #include  #include  #include  #include  using namespace std;typedef int semaphore;                          /* 信号量是一种特殊的整型变量 */    const int SIZ

叶现一的专栏 1万+

【客户案例】母婴行业头部品牌是如何做私域的

各品牌争相跑马圈地,想方设法圈住流量,建立品牌资产;私域运营是一项“重人力”的工作,在传统的品牌运营过程中,私域操盘手经常会由于一对多导致无法兼顾,只能通过提高触达次数的方式加大漏斗,这样难以让每个社群都发挥出应有的价值,甚至还会导致一定程度的用户流失。除了宝妈身份外激发的用户认同感、亲密度外,KOC们作为产品的使用者,自由选择的推品和自由创作的推广文案都更具有真实性、代表性,能够极大程度激发群友们的信任感,从而愿意为产品买单,转化复购水到渠成。不同阶段的宝妈,母婴知识的储存量和经验是不同的,K品牌还会。.

圈量SCRM系统-企微营销工具-私域流量运营软件 947

6.2 磁悬浮轴承:软件架构与实现

本文系统阐述了磁悬浮轴承控制系统的软件架构与实现方法。采用分层架构设计,包括硬件抽象层、实时控制内核、控制算法层和应用层,确保系统实时性和可靠性。重点分析了电流环、位置环等关键控制任务的调度策略,比较了不同硬件平台(DSP、ARM、FPGA)的软件实现方案。强调模块化设计、配置化管理等工程实践,并详细介绍了从算法仿真到系统联调的完整开发流程。最后指出严格的测试验证是保证系统性能的关键,需通过多阶段测试评估起浮时间、稳态精度等核心指标。

技术工作者 754

System V共享内存与信号量综合应用之生产者与消费者问题解决

一.生产者---消费者问题 有一个仓库(缓冲区),生产者生产出来的东西往里面扔,消费者从里面取东西。如何安排能够使两者之间不冲突。 一些基本的约束条件:     1.仓库只有一个,且有固定大小。生产者有多个消费者有多个     2.生产者占用仓库前要判断仓库是否满,满了就不能争用     3.消费者使用仓库前要判断仓库是否空,空了就不能争用     4.仓库中要么只有消费者要么

u014304293的专栏 2898

Cursor+Apifox MCP Server实战:5分钟搞定API自动化测试用例生成

本文详细介绍了如何利用Cursor IDE与Apifox MCP Server,在5分钟内将API文档自动转化为高质量的自动化测试用例。通过配置MCP Server建立数据桥梁,开发者可直接用自然语言指令,让AI基于真实接口规范生成可立即执行的pytest测试代码,大幅提升接口测试效率,特别适合快节奏的SaaS项目。

ooo22的博客 533

采用多线程技术解决生产者/消费者问题

采用多线程技术解决生产者/消费者问题 解决思路: 实现生产者,消费者的并发进程互斥操作(互斥问题) 解决办法:使用互斥锁,在进行生产,消费时将将互斥锁锁住,防止被抢占线程。 解决生产者生成上限和消费者消费下限(缓冲区问题) 解决办法:每次生产消费过程,判断缓冲区是否已慢或空;若缓冲区出现满或空的情况,让相应的生产消费进程进入等待状态,等待另一个进程传来的消费生产信号。 代码(C语言版): #include<stdio.h> #include<pthread.h> #defin

AEI的博客 1043

华为OD机试 - 音乐小说内容重复识别 - 并查集(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 159

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(下篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1622

linux下C语言实现生产者-消费者问题实现

linux下C语言实现生产者-消费者问题实现 在这里实现3个生产者与4个消费者,实现不同数目的话自己更改define即可 pthread_create、pthread_join、pthread_mutex_init 、pthread_mutex_lock、pthread_mutex_unlock用法from:pthread函数的使用 #include <stdio.h> #include <stdlib.h> #include <unistd.h> //w.

qq_45811908的博客 5950

【ARM AMBA5 CHI 2 -- CHI 链路层详细介绍 】

目前有六个版本的 CHI 协议,CHI-A 是 CHI 协议的第一个版本。它提供了一个传输层,具有减少拥塞的功能。新通道、CHI 术语和组件命名的定义;请求、监听过滤器和缓存状态转换的示例;事务排序、独占访问和分布式虚拟内存(DVM)操作的规则;CHI-B 问题扩展了 CHI-A,但不能直接向后兼容 CHI-A。更大的物理地址宽度;原子事务;DVM 的 VMID 扩展;通道字段、事务结构和可靠性、可用性和可维护性(RAS)特性的描述;

CodingCos的博客 2535

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题,主要是利用信号量处理线程间的同步和互斥问题。          “生产者——消费者”问题描述如下:           有一个有限缓冲区(这里用有名管道实现 FIFO 式缓冲区)和两个线程:生产者和消费者,它们分别不停地把产品放入缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也不IXUS等待。另外,因

知秋一叶 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux多线程实践(五 )Posix信号量和互斥锁解决生产者消费者问题

一点区别: system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步。system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1。除此之外,posix 信号量还有命名和匿名之分(man 7 sem_overview): Posix 信号量 有名信号量 无名信号量

NK_test的博客 5544

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

用多线程实现生产者与消费者的原理

实验目的     通过编写经典的“生产者-消费者”问题的实验,进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。 实验内容    “生产者--消费者”问题描述如下:    有一个有限缓冲区(这里用有名管道实现FIFO式缓冲区)和两个线程:生产者和消费者,它们不停地把产品放入缓冲区和从缓冲区拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者

1888

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多线程实验生产者消费者linux,多线程编程之:实验内容——“生产者消费者”实验-嵌入式系统-与非网...

9.3实验内容——“生产者消费者”实验1.实验目的“生产者消费者”问题是一个著名的同时性编程问题的集合。通过学习经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。2.实验内容“生产者—消费者”问题描述如下。有一个有限缓冲区和两个线程:生产者和消费者。他们分别不停地把产品放入缓冲区和从缓冲区中拿走产品。一个生产者在缓冲区满的...

weixin_29235923的博客 969

多线程实验生产者消费者linux,多线程编程之:实验内容——“生产者消费者”实验...

本文引用地址:http://www.eepw.com.cn/article/257119.htm9.3实验内容——“生产者消费者”实验1.实验目的“生产者消费者”问题是一个著名的同时性编程问题的集合。通过学习经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。2.实验内容“生产者—消费者”问题描述如下。有一个有限缓冲区和两个线程...

weixin_32746239的博客 1059

posix信号量的应用--生产者-消费者

目录 posix信号量的应用--生产者-消费者1. POSIX信号量2. 生产者-消费者 posix信号量的应用--生产者-消费者 在unix环境高级编程中提到了两种信号量,两种信号量作用和应用场景基本相同,但是posix信号量更常用,跨平台能力强,性能也更优越,以下...

测试 800

多线程同步之信号量

信号量是什么?简单来说,信号量就是一个计数值,假设记为S。S > 0时,表示当前可用资源的数目;S < 0时,其绝对值表示等待使用该资源的进程个数。信号量可作为一种同步手段控制多个进程对资源的访问。 可以通过PV操作改变信号量的值。 P操作: S = S -1; if S >= 0 continue; else blocked; ...

weixin_33697898的博客 300

Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

Posix信号量Posix 信号量有名信号量无名信号量sem_opensem_initsem_closesem_destroysem_unlink sem_waitsem_post 有名信号量#include /* For O_* constants */ #include /* For mode constants */ #include sem_t *s

菜鸟-翡青 4264

Linux 生产者消费者问题代码实现

进程间通信(Linux):使用多线程和信号量解决生产者/消费者问题:有一个长度为N的缓冲池被生产者和消费者共同使用。只要缓冲池未满,生产者就可以将消息送入缓冲池中;只要缓冲池不空,消费者便可从缓冲池中取走一个消息。生产者向缓冲池放入消息的同时,消费者不能操作缓冲池,反之亦然。 设计要求: (1) 说明设置哪些信号量?信号量的含义和初始值是什么?并用信号量和P、V操作写出进程的同步与互斥算法。(注:...

qq_43118757的博客 5159

Linux 中多线程编程 生产者和消费者问题

1.使用信号量解决 /*product.c*/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <errno.h> #include <sys/ipc.h> #include <semapho...

Bottle_Genius的博客 529

线程同步:用信号量解决生产者、消费者问题(C语言基础版)

本文介绍了线程同步的概念及其在生产者-消费者问题中的应用。线程同步通过信号量机制解决多线程共享资源时的竞态问题,二值信号量(0表示资源不可用,1表示可用)是实现同步的关键。文章详细讲解了信号量的初始化、P操作(申请资源)和V操作(释放资源)等核心函数,并给出了一个温湿度传感器数据采集的C语言实现案例:生产者线程生成随机温湿度数据存入全局变量,消费者线程将数据写入日志文件。通过两个信号量控制生产消费节奏,确保缓冲区不满不空,最终在终端和日志文件中成功输出同步数据。该案例验证了信号量机制能有效实现线程同步。

2301_82019104的博客 901
上一篇: linux 多线程面试题
下一篇: linux 多线程信号量(盘子水果问题)
最后冰吻free
博客等级 码龄12年 121粉丝 371原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值