IO进程线程Day5

1> 将互斥机制代码重新实现一遍

#include<myhead.h>char buf[128];    //临界资源pthread_mutex_t mutex;  //创建锁资源//分支线程
void* task(void* arg)	 
{while(1){//获取锁资源pthread_mutex_lock(&mutex);printf("这里是分支线程:%s\n",buf);strcpy(buf,"你好!!!!");//释放锁资源pthread_mutex_unlock(&mutex);}
}int main(int argc, const char *argv[])
{pthread_t tid;//定义线程IDpthread_mutex_init(&mutex,NULL);//初始化锁资源if(pthread_create(&tid,NULL,task,NULL)!=0){perror("create error");return -1;}//主线程while(1){//获取锁资源pthread_mutex_lock(&mutex);printf("这里是主线程:buf=%s\n",buf);strcpy(buf,"hello???");//释放锁资源pthread_mutex_unlock(&mutex);}//回收线程资源pthread_join(tid,NULL);//消毁锁资源pthread_mutex_destroy(&mutex);return 0;
}

2> 将同步机制代码重新实现一遍

#include<myhead.h>
sem_t sem;
void*skit1(void * arg)
{while(1){sleep(2);printf("我工作了一天\n");//释放资源sem_post(&sem);}
}void*skit2(void*arg)
{while(1){sem_wait(&sem);//申请资源printf("又赚了三百\n");}
}
int main(int argc, const char *argv[])
{pthread_t tid1,tid2;sem_init(&sem,0,0);//初始化无名信号量,第一个0表示线程通信,第二个表示value初始值0;//创建支线程1if(pthread_create(&tid1,NULL,skit1,NULL)!=0){printf("pthread error");return -1;}//创建支线程2if(pthread_create(&tid2,NULL,skit2,NULL)!=0){printf("pthread error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);sem_destroy(&sem);return 0;
}

3> 使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源

#include <myhead.h>
//创建无名信号量
sem_t sem;
//创建文件相关结构体
typedef struct File
{const char *src_file;const char *dest_file;off_t start;off_t end;
} * fileStruct;//获取文件字符长度
int length(const char *srcfile, const char *destfile)
{//打开原文件和目标文件int srcfd = open(srcfile, O_RDONLY);int destfd = open(destfile, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (srcfd == -1 || destfd == -1){perror("open file error");return -1;}//光标从头到尾,返回字符个数int len = lseek(srcfd, 0, SEEK_END);//关闭文件close(srcfd);close(destfd);return len;
}
//文件拷贝函数
int copy_file(const char *srcfile, const char *destfile, int start, int end)
{int srctd, desttd;//打开原文件和目标文件int srcfd = open(srcfile, O_RDONLY);//在计算字符长度函数中已经创建过文件,所以只需要写int destfd = open(destfile, O_WRONLY|O_TRUNC);if (srcfd == -1 || destfd == -1){perror("open file error");return -1;}//重新定位光标到文件开头lseek(srcfd, start, SEEK_SET);lseek(destfd, start, SEEK_SET);//搬运工char buffer[1] = "";int res_read = 0;int res_write = 0;//拷贝字符到创建的文件中去//当前光标位置在目标光标位置前,则写入while (start < end){res_read = read(srcfd, buffer, sizeof(buffer));if (res_read <= 0)break;res_write = write(destfd, buffer, res_read);start += res_write;}//关闭文件close(srcfd);close(destfd);
}
void *task1(void *arg)
{fileStruct fStruct = (fileStruct)arg;copy_file(fStruct->src_file, fStruct->dest_file, fStruct->start, fStruct->end);// 完成前一半拷贝,释放资源sem_post(&sem);free(fStruct); // 释放传入的结构体内存printf("线程1完成前半部分拷贝");
}
void *task2(void *arg)
{//等待线程tid1写入前一半,然后申请sem_wait(&sem);fileStruct fStruct=(fileStruct)arg;copy_file(fStruct->src_file,fStruct->dest_file,fStruct->start,fStruct->end);free(fStruct);printf("线程2完成前后部分拷贝");
}
int main(int argc, char const *argv[])
{//定义两个线程pthread_t tid1, tid2;//初始化无名信号量,要在创建线程前初始化sem_init(&sem, 0, 0);//获取返回的字符长度int len = length(argv[1], argv[2]);//创建结构体变量,并赋值fileStruct arg1 = (fileStruct)malloc(sizeof(struct File));fileStruct arg2 = (fileStruct)malloc(sizeof(struct File));arg1->src_file = argv[1];arg1->dest_file = argv[2];arg1->start = 0;arg1->end = len / 2;arg2->src_file = argv[1];arg2->dest_file = argv[2];arg2->start = len / 2;arg2->end = len;if (pthread_create(&tid1, NULL, task1, arg1) != 0){printf("create pthread1 error\n");return -1;}if (pthread_create(&tid2, NULL, task2, arg2) != 0){printf("create pthread2 error\n");return -1;}//线程资源回收pthread_join(tid1, NULL);pthread_join(tid2, NULL);//销毁无名信号量sem_destroy(&sem);return 0;
}

4> 使用三个线程完成:线程1输出字符'A',线程2输出字符'B',线程3输出字符'C',要求输出结果为:ABCABCABCABCABC...

#include <myhead.h>
sem_t sem1,sem2,sem3;//三个线程分别的无名信号量
//函数声明
void *task1(void *arg);
void *task2(void *arg);
void *task3(void *arg);
int main(int argc, const char *argv[])
{//无名信号量初始化sem_init(&sem1,0,1);//为了顺利进入第一个线程必须要初始化为1sem_init(&sem2,0,0);sem_init(&sem3,0,0);//定义三个线程pthread_t tid1,tid2,tid3;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("error1\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("error2\n");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){printf("error3\n");return -1;}//收尸pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);return 0;
}
void *task1(void *arg)
{while(1){sem_wait(&sem1);//询问当前任务的无名信号量(下同)putchar('A');fflush(stdout);//刷新缓冲区(下同)sleep(1);sem_post(&sem2);//将下一个任务的无名信号量改变为1(下同)}
}
void *task2(void *arg)
{while(1){sem_wait(&sem2);putchar('B');fflush(stdout);sleep(1);sem_post(&sem3);}
}
void *task3(void *arg)
{while(1){sem_wait(&sem3);putchar('C');fflush(stdout);sleep(1);sem_post(&sem1);}
}

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

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

相关文章

多线程模板应用实现(实践学习笔记)

出处&#xff1a;B站码出名企路 个人笔记&#xff1a;因为是跟着b站的教学视频以及文档初步学习&#xff0c;可能存在诸多的理解有误&#xff0c;对大家仅供借鉴&#xff0c;参考&#xff0c;然后是B站up阳哥的视频&#xff0c;我是跟着他学。大家有兴趣的可以到b站搜索。加油…

CAD安装教程

CAD安装教程 目录 一&#xff0e; 下载CAD二&#xff0e; 安装CAD 一&#xff0e; 下载CAD 如果需要CAD安装包请私信。 二&#xff0e; 安装CAD 解压压缩包AutoCAD2022中文版&#xff0c;以管理员身份运行AutoCAD_2022_Simplified_Chinese_Win_64bit_dlm.sfx。 选择解压路径。…

【sklearn练习】datasets的使用

一、数据集分类 1、fetch类的数据集&#xff1a; 以 "fetch" 开头的数据集&#xff0c;这些数据集通常不包含在 scikit-learn 的标准安装中&#xff0c;需要从远程服务器上下载。这些数据集通常比标准数据集更大&#xff0c;因此在使用它们之前&#xff0c;需要通过…

Spring MVC中@ExceptionHandler注解的智能处理机制——无需显示指定异常类型

概述 在深入探讨Spring MVC框架时&#xff0c;我们经常会遇到异常处理的相关场景。其中&#xff0c;ExceptionHandler注解是一个非常重要的工具&#xff0c;它允许我们声明一个方法来专门处理特定类型的异常。有趣的是&#xff0c;Spring容器具备智能化的异常类型关联功能&…

自动驾驶:低阶可部署的单目测距算法-基于YOLO与透视变换

一、开发环境 部署平台&#xff1a;英伟达的Jetson Nano 环境&#xff1a;Linux ROS 语言&#xff1a;C 设备&#xff1a;1920*1080像素的摄像头、开发板。 模型&#xff1a;yolo-v8s 二、单目测距实现思路 0、标定相机和车辆&#xff08;假设已经标定完成&#xff09; 1、通…

06-微服务-SpringAMQP

SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交…

[论文阅读] Revisiting Feature Propagation and Aggregation in Polyp Segmentation

[论文地址] [代码] [MICCAI 23] Abstract 息肉的准确分割是筛查过程中有效诊断结直肠癌的关键步骤。 由于能够有效捕获多尺度上下文信息&#xff0c;普遍采用类似UNet 的编码器-解码器框架。 然而&#xff0c;两个主要限制阻碍了网络实现有效的特征传播和聚合。 首先&#xff…

基于SSM的企业员工管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

[AutoSar]基础部分 RTE 04 数据类型的定义及使用

目录 关键词平台说明一、数据类型分类二、Adt三、Idt四、Base 数据类型五、units六、compu methods七、data constraint 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、数据…

python自动化测试面试题与答案汇总

对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范…

ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript

ts axios 指定返回值类型&#xff0c;返回数据类型不确定该怎么办 typescript 转到 ts 以来&#xff0c;一直有个问题困扰着我&#xff0c;就是每次用 axios 获取数据时&#xff0c;返回值 res 的类型都不能确定&#xff0c;这就导致编辑器一直提示我&#xff1a; 原因 原因是…

SPON世邦 IP网络对讲广播系统 多处文件上传漏洞复现

0x01 产品简介 SPON世邦IP网络对讲广播系统是一种先进的通信解决方案,旨在提供高效的网络对讲和广播功能。 0x02 漏洞概述 SPON世邦IP网络对讲广播系统 addscenedata.php、uploadjson.php、my_parser.php等接口处存在任意文件上传漏洞,未经身份验证的攻击者可利用此漏洞上…

Mac M1 Parallels CentOS7.9 Deploy Docker + Rancher + K8S(HA+More Master)

一、准备虚拟机资源 虚拟机清单 机器名称IP地址角色rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.203K8S集群主节点node0110.211.55.211K8S集群从节点node0210.211.55…

Vue 自定义仿word表单下拉框组件,让操作更符合用户习惯

预览时显示界面 进入编辑框时 组件代码 <template><div class "paper-select ui-select flex flex-col full-width" ><div ref"content" class"content font-s flex flex-center-cz padding-left-m padding-right-m flex-space-be…

C++入门教程,C++基础教程(第一部分:从C到C++)七

由C语言发展而来的一种面向对象的编程语言。 第一部分、从C语言到C 本章讲述 C 语言的简史&#xff0c;以及 C 语言中与面向对象关系不大、C语言中没有的特性。这些特性能够增加编程的便利性&#xff0c;提高程序的可扩充性。 十三、如何规范地使用C内联函数 inline 关键字…

Mac M1 Parallels CentOS7.9 Install Parallels Tools

一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护&#xff0c;将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…

TypeScript 从入门到进阶之基础篇(八)函数篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

Open CASCADE学习|Draw Harness

目录 显示长方体 提供帮助信息 执行文件 记录交互式命令 使用getsourcefile可以快速查找到Tcl命令对应的C源文件 在Tcl中内置了一些变量&#xff0c;并赋予了一定的功能。内置变量列表如下&#xff1a; 退出 加载插件 在屏幕显示变量 返回绘图变量信息 视图 mu, md…

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法&#xff1a; 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础&#xff0c;所以是每一个类的父类。所有的对象&#xff0c;包括数组&#xff0c;都实现了在Object类中定义的方法。 回到…