IO和进程day06(线程续、同步线程互斥)

news2024/7/11 11:33:57

今日任务:

1.代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//创建互斥锁
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//创建条件变量
int flag=0;//0为str空,1为有str值
char str[64]={0};
void *fun1(void*arg){
	//读取
	int fd_rd=open("./1.txt",O_RDONLY);
	if(fd_rd==-1){
		perror("open");
		return NULL;
	}

	while(1){
		//上锁
		pthread_mutex_lock(&mutex);
		if(flag==0){
			memset(str,0,sizeof(str));
			if(read(fd_rd,str,sizeof(str))==0){
				flag=1;
				memset(str,0,sizeof(str));
				pthread_cond_signal(&cond);
				pthread_mutex_unlock(&mutex);
				pthread_exit(NULL);
				break;
			}
			flag=1;
			pthread_cond_signal(&cond);
		}else{
			pthread_cond_wait(&cond,&mutex);
		}
		//解锁
		pthread_mutex_unlock(&mutex);

	}
	pthread_exit(NULL);
}
void *fun2(void*arg){

	//写出
	while(1){
		pthread_mutex_lock(&mutex);

		if(flag==1){
			if(0==strlen(str)){//退出条件
				puts("read end");

				pthread_mutex_unlock(&mutex);
				pthread_exit(NULL);
				break;
			}
			printf("%s",str);
			flag=0;
			pthread_cond_signal(&cond);
		}else{
			pthread_cond_wait(&cond,&mutex);
		}

		pthread_mutex_unlock(&mutex);
	}
	pthread_exit(NULL);

}
int main(int argc, const char *argv[])
{


	//创建两个线程,一个读取,一个写出
	pthread_t th1,th2;
	if(pthread_create(&th1,NULL,fun1,NULL)!=0){
		fprintf(stderr,"create failed");
		return -1;
	}
	if(pthread_create(&th2,NULL,fun2,NULL)!=0){
		fprintf(stderr,"create failed");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	//销毁互斥锁
	pthread_mutex_destroy(&mutex);
	//摧毁条件变量
	pthread_cond_destroy(&cond);
	return 0;
}

运行结果:

2.代码:

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


pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//创建锁
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
int flag=1;
void *fun1(void*arg){
	while(1){
		//上锁

		pthread_mutex_lock(&mutex);
		if(flag==1){
			printf("A");
			flag=2;
			pthread_cond_signal(&cond2);
			
		}else{
			pthread_cond_wait(&cond1,&mutex);
		}
//解锁
			pthread_mutex_unlock(&mutex);
	}
	pthread_exit(NULL);
}
void *fun2(void*arg){
	while(1){

		//上锁
		
		pthread_mutex_lock(&mutex);
		if(flag==2){
			printf("B");
			flag=3;
			pthread_cond_signal(&cond3);
			
		}else{
			pthread_cond_wait(&cond2,&mutex);
		}
//解锁
			pthread_mutex_unlock(&mutex);

	}
	pthread_exit(NULL);
}
void *fun3(void*arg){
	while(1){
		//上锁
		
		pthread_mutex_lock(&mutex);
		if(flag==3){
			printf("C");
			flag=1;
			pthread_cond_signal(&cond1);
					}else{
			pthread_cond_wait(&cond3,&mutex);
		}
//解锁
			pthread_mutex_unlock(&mutex);

	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	pthread_t th1,th2,th3;
	if(pthread_create(&th1,NULL,fun1,NULL)!=0){
		fprintf(stderr,"thread create");
		return -1;
	}
	if(pthread_create(&th2,NULL,fun2,NULL)!=0){
		fprintf(stderr,"thread create");
		return -1;
	}
	if(pthread_create(&th3,NULL,fun3,NULL)!=0){
		fprintf(stderr,"thread create");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	pthread_join(th3,NULL);
	//销毁锁
	pthread_mutex_destroy(&mutex);
	//销毁条件变量
	pthread_cond_destroy(&cond1);
	pthread_cond_destroy(&cond2);
	pthread_cond_destroy(&cond3);
	return 0;
}

运行结果

3.代码:

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

char buf[]="1234567";
sem_t sem1;
sem_t sem2;
void * fun1(void*arg){
	while(1){
	if(sem_wait(&sem1)!=0){
		perror("fun1 wait");
		return NULL;
	}
	//逆置
	for (int i=0; i<sizeof(buf)/2; i++)
	{
		char temp=buf[i];
		buf[i]=buf[strlen(buf)-1-i];
		buf[strlen(buf)-1-i]=temp;
	}
	if(sem_post(&sem2)!=0){
		perror("fun1 ");
	}
	}
}
void* fun2(void*arg){
	while(1){
	if(sem_wait(&sem2)!=0){
		perror("fun1 wait");
		return NULL;
	}
	printf("%s\n",buf);
	if(sem_post(&sem1)!=0){
		perror("fun1 ");
	}
	}
}
int main(int argc, const char *argv[])
{

	//创建信号量
	if(-1==sem_init(&sem1,0,1)){
		perror("sem create");
	}
	if(-1==sem_init(&sem2,0,0)){
		perror("sem create");
	}
	//创建进程
	pthread_t th1,th2;
	if(pthread_create(&th1,NULL,fun1,NULL)!=0){
		fprintf(stderr,"th1 create failed");
		return -1;
	}
	if(pthread_create(&th2,NULL,fun2,NULL)!=0){
		fprintf(stderr,"th2 create failed");
		return -1;
	}
	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	//销毁
	sem_destroy(&sem1);
	sem_destroy(&sem2);
	return 0;
}

运行结果:

今日思维导图

今天 的脑子不太够用

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

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

相关文章

10分钟带你深入理解JavaScript的执行上下文和闭包机制

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4da; 前言 &#x1f4d8; 一. JavaScript中的闭包 &#x1f4d8; 二. 执行上下文与闭包 &#x1f4d…

03-Redis主从架构

上一篇&#xff1a;02-Redis持久化 1.主从架构搭建 配置从节点步骤&#xff1a; 1、复制一份redis.conf文件 2、将相关配置修改为如下值&#xff1a; port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" dir …

使用亚马逊云科技Amazon SageMaker,为营销活动制作广告素材

广告公司可以使用生成式人工智能和文字转图像根基模型&#xff0c;制作创新的广告素材和内容。在本篇文案中&#xff0c;将演示如何使用亚马逊云科技Amazon SageMaker从现有的基本图像生成新图像&#xff0c;这是一项完全托管式服务&#xff0c;用于大规模构建、训练和部署机器…

PPPoE适用于Linux操作系统的指南

欢迎来到本文&#xff0c;亲爱的Linux用户&#xff01;今天&#xff0c;我将为你提供一个完整的指南&#xff0c;教你如何在Linux操作系统上设置和配置PPPoE连接。无需担心复杂性&#xff0c;跟着我一步一步来&#xff0c;你将轻松掌握这一技能&#xff01; 第一步&#xff0c…

工厂除静电除尘设备--离子风枪

静电无处不在&#xff0c;区别在于静电的多少而已。特别是工业生产过程中&#xff0c;大量的静电会有很多危害。 静电的危害有几点&#xff1a;1.引起电子设备的故障或误动作&#xff0c;造成电磁干扰。2.击穿集成电路和精密的电子元件&#xff0c;或使元件老化&#xff0c;拉…

酷开科技打造更好体验服务用户

智能电视以其海量资源、智慧大屏、高清画质等特点在国内快速普及。然而&#xff0c;随着用户量的增加、用户群体的需求多元化&#xff0c;导致消费者对智能电视的应用要求越来越高&#xff0c;不仅希望智能电视内容丰富&#xff0c;最好还能拥有“多合一”的功能。 好在&#…

气传导蓝牙耳机什么牌子好?精选5款值得推荐的气传导耳机分享

​无论是运动爱好者、户外探险家还是上班族&#xff0c;气传导耳机都能带给您全新的聆听体验。但选择一款好的耳机&#xff0c;也不是一件容易的事&#xff0c;市面气传导耳机质量也参差不齐&#xff0c;有很多使用起来不好用。所以小篇从网上精选5款最值得推荐的气传导耳机&am…

个人云存储:使用Cpolar和极简主义文件管理器构建的公网访问平台

文章目录 1. 前言2.Tiny File Manager网站搭建2.1.Tiny file manager下载和安装2.2 Tiny file manager网页测试2.2 Tiny file manager网页测试3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试总结 1. 前言 文件共享和查阅是现在网络最常见的应用场景&am…

搞懂 Prometheus 这四种指标类型,谁都可能成为监控老司机?

指标是用来衡量性能、消耗、效率和许多其他软件属性随时间的变化趋势。它们允许工程师通过警报和仪表盘来监控一系列测量值的演变&#xff08;如CPU或内存使用量、请求持续时间、延迟等&#xff09;。指标在IT监控领域有着悠久的历史&#xff0c;并被工程师广泛使用&#xff0c…

管理类联考——数学——汇总篇——知识点突破——应用题——至少至多

&#x1f434; ⛲️ 一、考点讲解 至少至多问题也属于动态的最值问题&#xff0c;是考生失分率较高的题型&#xff0c;这类题目思路比较灵活&#xff0c;无固定化的公式和结论&#xff0c;所以考生必须灵活处理。 二、考试解读 这类题目难度较大&#xff0c;属于拉分题目。对…

企业综合信息化,人力资源管理,培训考学管理,电子采购(源码系统)

前言&#xff1a; 随着现代信息技术的不断发展&#xff0c;企业综合信息化已成为一种必然趋势。企业综合信息化是指将信息技术与企业业务流程相结合&#xff0c;实现企业资源的优化配置和高效利用&#xff0c;提升企业的竞争力和生产力。在实现企业综合信息化的过程中&#xff…

页面解析之结构化数据

结构化的数据是最好处理&#xff0c;一般都是类似JSON格式的字符串&#xff0c;直接解析JSON数据&#xff0c;提取JSON的关键字段即可。 1、JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff1b;适用于进行数据交互的场景&#xff0c;比如网站前台…

汇报一下日常健身和锻炼方面的进展

跑步app最终从“咕咚”和“悦跑圈”二选一&#xff0c;锁定到悦跑圈上了。 七月太热&#xff0c;配速下降&#xff0c;但还能玩出花样 八月中旬气温稍降&#xff0c;配速提升&#xff0c;拟合抛物线 截至发博日,实际连续跑步接近600天了 截至发博日&#xff0c;完成2023跑量96…

测评补单:Temu卖家的市场攻略,轻松吸引更多流量和转化!

拼多多通过广告和低价策略的做法迅速拿下了美国市场。在欧美市场取得初步成果后&#xff0c;Temu又踏步走向了其他海外市场。今年7月&#xff0c;Temu先后进入了日本、韩国两地&#xff0c;进军亚洲市场。8月底&#xff0c;Temu又再一次扩张&#xff0c;这次目的地是东南亚。其…

新加坡市场最全开发攻略

作为东盟经济的“发动机”&#xff01;新加坡是继纽约、伦敦、香港之后的第四大国际金融中心。据《2022年全球竞争力》报告显示&#xff0c;新加坡是亚洲地区排名最高的&#xff0c;位列全球三甲之一。 同时&#xff0c;新加坡作为东盟(ASEAN)的核心成员国&#xff0c;还是世贸…

QT QProgressBar控件 使用详解

本文详细的介绍了QProgressBar控件的各种操作&#xff0c;例如&#xff1a;新建界面、设置最大最小值、设置进度、返回进度最小值、返回进度最大值、返回当前进度值、重置进度默认值、返回进度条文本、设置进度条文本、设置显示进度条、设置垂直水平、样式表、信号槽、源代码、…

第2章_freeRTOS入门与工程实践之单片机程序设计模式

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

Leetcode376. 摆动序列

Every day a Leetcode 题目来源&#xff1a;376. 摆动序列 解法1&#xff1a;动态规划 约定&#xff1a; 某个序列被称为「上升摆动序列」&#xff0c;当且仅当该序列是摆动序列&#xff0c;且最后一个元素呈上升趋势。某个序列被称为「下降摆动序列」&#xff0c;当且仅当…

再聊Java Stream的一些实战技能与注意点

大家好&#xff0c;又见面了。 在此前我的文章中&#xff0c;曾分2篇详细探讨了下JAVA中Stream流的相关操作&#xff0c;2篇文章收获了累计 10w阅读、2k点赞以及 5k收藏的记录。能够得到众多小伙伴的认可&#xff0c;是技术分享过程中最开心的事情。 不少小伙伴在评论中提出了…

前端开发工程师:职业前景、工资、 具体工作

该篇适用于从零基础学习前端的小白 一、职业前景 前端这两年也是非常火的&#xff0c;就业的前景也是非常不错的。 1.需求持续增长&#xff1a; 随着互联网和移动设备的普及&#xff0c;越来越多的企业和组织需要建立和维护网站、应用程序和在线平台。这导致了对具有前端开发…