线程的中互斥锁和条件变量的运用

news2024/11/14 20:26:04

第一题:使用互斥锁或者信号量,实现一个简单的生产者消费者模型 一个线程每秒生产3个苹果,另一个线程每秒消费8个苹果

#include <myhead.h>

pthread_mutex_t m1,m2;
 
int apple = 0;
void* usrapp(void* data)
{
	while(1)
	{
		pthread_mutex_lock(&m1);
		pthread_mutex_lock(&m2);

		apple-=8;
        printf("还有%d个苹果\n", apple);
		pthread_mutex_unlock(&m1);
		sleep(1);
	}
}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&m1,0);
	pthread_mutex_init(&m2,0);

	pthread_mutex_lock(&m2);
 
	pthread_t id;
	pthread_create(&id,0,usrapp,0);
	pthread_detach(id);

	while(1)
	{
		pthread_mutex_lock(&m1);
		apple+=3;
		pthread_mutex_unlock(&m1);
		if(apple >=8) {pthread_mutex_unlock(&m2);}
		sleep(1);
	}
 
	pthread_mutex_destroy(&m1);
	pthread_mutex_destroy(&m2);
	return 0;
}

第二题:
有一个盘子,盘子里面最多放3个苹果,5个橘子
2个生产者线程,一个每秒放1个苹果,另一个每秒2个橘子
放了苹果就不能放橘子,放了橘子就不能放苹果
2个消费者线程,1号消费者线程每秒消费2个苹果,2号消费者线程,每秒消费3个橘子

#include <myhead.h>
#include <time.h>
#include <stdlib.h>

int orange = 0, apple = 0;

pthread_mutex_t ap_m;
pthread_mutex_t or_m;
pthread_mutex_t m;

pthread_cond_t cond1;
pthread_cond_t cond2;

void *apple_run(void *arg){
	while(1){
		pthread_mutex_lock(&ap_m);
		pthread_cond_wait(&cond1, &ap_m);
		apple -= 2;
		printf("消费苹果2个\n");
		pthread_mutex_unlock(&ap_m);
		sleep(1);
	}
}

void *orange_run(void *arg){
	while(1){
		pthread_mutex_lock(&or_m);
		pthread_cond_wait(&cond2, &or_m);
		orange -= 3;
		printf("消费橘子3个\n");
		pthread_mutex_unlock(&or_m);
		sleep(1);
	}
}

void *produce(void *arg){
	while(1){
		pthread_mutex_lock(&m);
		if(orange < 4){
			pthread_mutex_lock(&or_m);
			orange += 2;
			printf("orange:%d\n", orange);
			pthread_mutex_unlock(&or_m);
		}else{
			pthread_mutex_unlock(&m);
			continue;
		}
		
		if(apple >= 2){
			pthread_cond_signal(&cond1);
		}
		if(orange >= 3){
			pthread_cond_signal(&cond2);
		}
		sleep(1);
		pthread_mutex_unlock(&m);
	}
}

int main(int argc, const char *argv[])
{
	pthread_mutex_init(&ap_m, 0);
	pthread_mutex_init(&or_m, 0);
	pthread_mutex_init(&m, 0);
	pthread_cond_init(&cond1, 0);
	pthread_cond_init(&cond2, 0);
	
	pthread_t ap;
	pthread_t or;
	pthread_t pro;

	pthread_create(&pro, 0, produce, 0);
	pthread_create(&ap, 0, apple_run, 0);
	pthread_create(&or, 0, orange_run, 0);

	pthread_detach(ap);
	pthread_detach(or);
	pthread_detach(pro);

	while(1){
		pthread_mutex_lock(&m);
		if(apple < 3){
			apple += 1;
			printf("apple:%d\n", apple);
			pthread_mutex_unlock(&ap_m);
		}else{
			pthread_mutex_unlock(&m);
			continue;
		}
		
		if(apple >= 2){
			pthread_cond_signal(&cond1);
		}
		if(orange >= 3){
			pthread_cond_signal(&cond2);
		}
		sleep(1);
		pthread_mutex_unlock(&m);
	}
	return 0;
}

第三题

#include <myhead.h>                        
int getch();
int main(int argc, const char *argv[])
{
    int a;
    a = getch();
    printf("%d", a);
    return 0;
}

 实现现象:将终端输入的字符转换为其对应的ASCII码值返回

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

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

相关文章

旋转差分,以及曼哈顿距离转换切比雪夫距离

拿到这个问题我们要怎么去想呢&#xff0c;如果是暴力的修改的话&#xff0c;我们的复杂度为 m * 2r*r 的复杂度&#xff0c;这也太暴力了&#xff0c;我们要怎么办呢&#xff0c;我们能不能用差分数组来实现呢&#xff1f; 我们首先要看如何实现公式的转换 很显然我们可以利用…

<数据集>pcb板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;693张 标注数量(xml文件个数)&#xff1a;693 标注数量(txt文件个数)&#xff1a;693 标注类别数&#xff1a;6 标注类别名称&#xff1a;[missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur…

物联网与区块链技术的跨界融合:智能城市的建设与管理

随着科技的迅猛发展&#xff0c;物联网&#xff08;IoT&#xff09;和区块链技术逐渐成为推动智能城市发展的重要技术支柱。本文将探讨物联网和区块链技术在智能城市建设与管理中的跨界融合&#xff0c;分析其应用场景和潜力。 什么是智能城市&#xff1f; 智能城市利用先进的…

(35)远程识别(又称无人机识别)(一)

文章目录 前言 1 更改 2 可用的设备 3 开放式无人机ID 4 ArduRemoteID 5 终端用户数据的设置和使用 6 测试 7 为OEMs添加远程ID到ArduPilot系统的视频教程 前言 在一些国家&#xff0c;远程 ID 正在成为一项法律要求。以下是与 ArduPilot 兼容的设备列表。这里(here)有…

深度刨析C语言中的动态内存管理

文章目录 1.为什么会存在动态内存分配2.动态内存函数介绍2.1 [malloc](https://legacy.cplusplus.com/reference/cstdlib/malloc/?kwmalloc)与[free](https://legacy.cplusplus.com/reference/cstdlib/free/?kwfree)2.2 [calloc](https://legacy.cplusplus.com/reference/cst…

Redis - SpringDataRedis - RedisTemplate

目录 概述 创建项目 引入依赖 配置文件 测试代码 测试结果 数据序列化器 自定义RedisTemplate的序列化方式 测试报错 添加依赖后测试 存入一个 String 类型的数据 测试存入一个对象 优化 -- 手动序列化 测试存入一个Hash 总结&#xff1a; 概述 SpringData 是 S…

浏览器【WebKit内核】渲染原理【QUESTION-1】

浏览器【WebKit内核】渲染原理【QUESTION】 1.浏览器输入一个网址&#xff08;域名之后&#xff09;,浏览器会呈现一个新的页面&#xff0c;中间的过程是怎么实现的&#xff1f; 输入一个网址之后&#xff0c;首先DNS服务器会解析这个域名&#xff0c;将这个域名解析成IP地址&…

SAP 贷项销售订单简介

SAP 贷项销售订单简介 1. 什么是销售贷方销售订单?2. 创建销售贷方销售订单的场景3. 销售贷方销售订单的创建流程直接创建发票---VF01将会计凭证过账到会计核算查看贷项销售订单凭证流查看客户明细---FBL5N贷项后台配置SAP销售贷方销售订单(Sales Credit Memo Request)是销售…

北醒单点激光雷达更改id和波特率以及Ubuntu20.04下CAN驱动

序言&#xff1a; 需要的硬件以及软件 1、USB-CAN分析仪使用顶配pro版本&#xff0c;带有支持ubuntu下的驱动包的&#xff0c;可以读取数据。 2、电源自备24V电源 3、单点激光雷达接线使用can线可以组网。 一、更改北醒单点激光雷达的id号和波特率 安装并运行USB-CAN分析仪自带…

pdf压缩在线免费 pdf压缩在线免费网页版 在线pdf压缩在线免费 pdf压缩工具在线免费

在数字化时代&#xff0c;pdf文件已经成为我们工作、学习和生活中的重要组成部分。然而&#xff0c;体积庞大的pdf文件往往给我们的存储空间、传输速度带来不小的压力。本文将为您揭秘几种简单有效的pdf文件压缩方法&#xff0c;让您轻松应对文件体积过大带来的困扰。 方法一、…

C++从入门到起飞之——const成员函数Date类实现 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 代码链接&#xff1a;这篇文章代码的所有代码都在我的gitee仓库里面啦&#xff0c;需要的小伙伴点击自取哦…

【论文解读】大模型算法发展

一、简要介绍 论文研究了自深度学习出现以来&#xff0c;预训练语言模型的算法的改进速度。使用Wikitext和Penn Treebank上超过200个语言模型评估的数据集(2012-2023年)&#xff0c;论文发现达到设定性能阈值所需的计算大约每8个月减半一次&#xff0c;95%置信区间约为5到14个月…

React中的无状态组件:简约之美

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【掌握浏览器版本检测&#xff1a;从代码到用户界面】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言…

OS:处理机进程调度

1.BackGround&#xff1a;为什么要进行进程调度&#xff1f; 在多进程环境下&#xff0c;内存中存在着多个进程&#xff0c;其数目往往多于处理机核心数目。这就要求系统可以按照某种算法&#xff0c;动态的将处理机CPU资源分配给处于就绪状态的进程。调度算法的实质其实是一种…

使用 ComfyUI 跑 SD 图,就两个字:惊艳!

大家好&#xff0c;我是想象&#xff0c;AI 破局 9 颗 AI 之心持有者。ComfyUI 已经出来有一段时间了&#xff0c;一直没有深入去学习过&#xff0c;今天花了点时间跑了一下。体验下来&#xff0c;就两个字&#xff1a;惊艳&#xff01; 这张 3 个小丑的图&#xff0c;很真实吧…

MT6816磁编码IC在自动缩口机中的应用

随着工业自动化的快速发展&#xff0c;各种智能传感器与执行器在制造业中发挥着越来越重要的作用。其中&#xff0c;磁编码IC以其高精度、高可靠性以及优秀的环境适应性&#xff0c;成为了工业自动化控制中不可或缺的一部分。本文将详细介绍MT6816磁编码IC在自动缩口机中的应用…

【数字】三态门,双向端口,HDL描述

#工作记录# 之前工作的时候&#xff0c;负责GPIO的同事被负责人问“三态的en开启的时候是直通的吗&#xff1f;” 他支支吾吾的回答“是的吧”&#xff0c;负责人又问了一句&#xff0c;他就有点不自信了&#xff0c;顺手记录一下这个在SoC设计中非常常见的逻辑。 目录 一、…

Python爬虫 instagram API获取instagram帖子数据信息

这个instagram接口可以通过url链接直接获取相关帖子信息。如有需求&#xff0c;可点击文末链接联系我们。 详细采集页面 https://www.instagram.com/p/CqIbCzYMi5C/ 请求参数 返回示例 { "__typename": "GraphSidecar", "accessibility_caption&qu…

STM32H7串口中断服务函数会禁止中断

STM32H7 在中断服务函数HAL_UART_IRQHandler中&#xff0c;会禁止接收中断 同时也会禁止发送完成中断&#xff0c;调用UART_EndTransmit_IT来进行操作

微信小程序-自定义组件生命周期

一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值&#xff0c;但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…