23111 IO进程线程 day5

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

#include<myhead.h>char buf[128];//定义互斥锁变量
pthread_mutex_t mutex;//创建分支线程函数
void *task(void *arg)
{while(1){//获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中buf=%s\n",buf);strcpy(buf,"I love China\n");//释放互斥锁资源pthread_mutex_unlock(&mutex);}
}int main(int argc, const char *argv[])
{pthread_t tid=0;//初始化互斥锁pthread_mutex_init(&mutex,NULL);//创建线程tid=pthread_create(&tid,NULL,task,NULL);if(tid!=0){printf("tid create error\n");return -1;}while(1){//获取锁资源pthread_mutex_lock(&mutex);printf("主线程中buf=%s\n",buf);strcpy(buf,"hello world\n");//释放互斥锁资源pthread_mutex_unlock(&mutex);}//阻塞回收线程pthread_join(tid,NULL);//销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

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

#include<myhead.h>//定义一个无名变量
sem_t sem;//生产函数
void *task1(void *arg)
{while(1){printf("我生产了一辆车\n");sleep(2);//释放无名变量的资源sem_post(&sem);}
}//消费函数
void *task2(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);//创建两个线程if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return -1;}//回收线程pthread_join(tid1,NULL);pthread_join(tid2,NULL);//销毁无名变量的资源sem_destroy(&sem);return 0;
}


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

#include<myhead.h>//定义一个结构体
typedef struct 
{const char *src;//源文件的地址const char *dst;//目标文件的地址int start;      //文件的光标位置int len;        //文件的长度
}info_t;//计算文件长度
int file_len(const char *srcfile,const char * dstfile)
{int sfd,dfd;int len=0;//以只读的形式打开源文件if((sfd=open(srcfile,O_RDONLY))==-1){perror("open srcfile error");return -1;}//以读写的形式打开目标文件if((dfd=open(dstfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){perror("open dstfile error");return -1;}//计算源文件长度len=lseek(sfd,0,SEEK_END);       //关闭文件close(sfd);close(dfd);return len;
}int copy_file(const char *srcfile,const char * dstfile,int start,int len)
{int sfd,dfd;char buf[128] = "";int res=0;int sum=0;//以只写的形式打开源文件if((sfd = open(srcfile,O_RDONLY))==-1){perror("open srcfile error");return -1;}//以读写的形式打开目标文件if((dfd = open(dstfile,O_RDWR))==-1){perror("open dstfile error");return -1;}//将文件光标定位在start处lseek(sfd,start,SEEK_SET);lseek(dfd,start,SEEK_SET);while(1){//读取源文件res= read(sfd,buf,sizeof(buf));//计算读取的文件字节总长度sum+=res;if(res==0 || sum>len) {//写入最后一次读取的内容write(dfd,buf,res-(sum-len));break;}//将内容写入目标文件write(dfd,buf,res);}//关闭文件close(sfd);close(dfd);return 0;
}//分支线程函数
void *task(void *arg)
{info_t f=*(info_t *)arg;copy_file(f.src,f.dst,f.start,f.len);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//定义线程变量pthread_t tid1,tid2;int len;//判断是否外部传参if(argc!= 3){printf("input error,try again\n");printf("usage:./a.out srcfile dstfile\n");return 0;}//计算文件长度len=file_len(argv[1],argv[2]);info_t f[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};//创建两个线程if(pthread_create(&tid1,NULL,task,(void*)&f[0])!=0){printf("tid1 create error\n");return -1;}if(pthread_create(&tid2,NULL,task,(void*)&f[1])!=0){printf("tid2 create error\n");return -1;}printf("拷贝成功\n");//结束线程pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

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

#include<myhead.h>//定义无名变量
sem_t sem1;
sem_t sem2;
sem_t sem3;//线程1
void *task1(void *arg)
{while(1){//申请C资源sem_wait(&sem3);printf("A");//释放A资源sem_post(&sem1);	}
}
//线程2
void *task2(void *arg)
{while(1){//申请A资源sem_wait(&sem1);printf("B");//释放B资源sem_post(&sem2);}
}
//线程3
void *task3(void *arg)
{while(1){//申请B资源sem_wait(&sem2);printf("C");//释放C资源sem_post(&sem3);	}
}int main(int argc, const char *argv[])
{pthread_t tid1,tid2,tid3;//初始化无名变量sem_init(&sem1,0,0);sem_init(&sem2,0,0);sem_init(&sem3,0,1);//创建线程if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){printf("tid3 create error\n");return -1;}//线程资源回收pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);//销毁无名信号量sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);return 0;
}


思维导图

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

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

相关文章

Redis 教程

Redis 简介 Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

移动神器RAX3000M路由器不刷固件变身家庭云之六(高级应用):设置https

本系列文章&#xff1a; 移动神器RAX3000M路由器变身家庭云之一&#xff1a;开通SSH&#xff0c;安装新软件包 移动神器RAX3000M路由器变身家庭云之二&#xff1a;安装vsftpd 移动神器RAX3000M路由器变身家庭云之三&#xff1a;外网访问家庭云 移动神器RAX3000M路由器变身家庭云…

数据库高可用mha

MHA搭建的步骤 一.配置主从复制 1.初始化环境 #在四台服务器上初始化环境 systemctl stop firewalld systemctl disable firewalld setenforce 0 2.修改 Master、Slave1、Slave2 节点的主机名 #在Master上 hostnamectl set-hostname mysql1 su#在Slave1 hostnamectl set-h…

WPF美化ItemsControl1:不同颜色间隔

首先我们有的是一个绑定好数据的ItemsControl <ItemsControl ItemsSource"{Binding Starts}"> </ItemsControl> 运行后呢是朴素的将数据竖着排列 如果想要数据之间有间距&#xff0c;可以使用数据模板&#xff0c;将数据放到TextBlock中显示&#xff0…

MATLAB - MPC - 优化问题(Optimization Problem)

系列文章目录 前言 模型预测控制可在每个控制间隔内解决一个优化问题&#xff0c;具体来说就是二次规划(QP)。求解结果决定了被控对象在下一个控制间隔之前使用的操纵变量&#xff08;MV&#xff09;。 该 QP 问题具有以下特点&#xff1a; 目标或 "成本 "函数 - …

Unity游戏内相机(主角头部视角)的旋转问题:“万向节锁定”(Gimbal Lock)

前言&#xff1a; 在Unity中&#xff0c;相机的正前方是Z正半轴&#xff0c;相机的正右方是X正半轴&#xff0c;相机的正上方是Y正半轴。这个很好理解。 现在&#xff0c;我想要相机看向左前上方45&#xff0c;你会觉得要怎么做呢&#xff1f; 如果是我的话&#xff0c;我的第一…

YOLOv8改进 | 损失篇 | VarifocalLoss密集目标检测专用损失函数 (VFLoss,原论文一比一复现)

一、本文介绍 本文给大家带来的是损失函数改进VFLoss损失函数,VFL是一种为密集目标检测器训练预测IoU-aware Classification Scores(IACS)的损失函数,我经过官方的版本将其集成在我们的YOLOv8的损失函数使用上,其中有很多使用的小细节(否则按照官方的版本使用根本拟合不了…

[C#]使用OpenCvSharp实现区域文字提取

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 采用opencv算法实现文字区域提取&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;形态学操作 &#xff08;2&#xff09;查找轮廓 &#xff08;3&#xff09;筛选那些面积小的 &#xff08;4&#…

ubuntu 安装 anaconda

ubuntu 安装 anaconda 下载 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh安装 bash Anaconda3-2023.09-0-Linux-x86_64.sh2.1 回车继续 2.2 许可协议 输入 q 退出阅读许可协议 2.3 输入 yes 接受 许可协议 2.4 设置 anaconda 安装位置 如不需…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

七牛云cdn图片加载错误:net::ERR_HTTP2_PROTOCOL_ERROR与HTTP2 检测工具

一、问题描述 今天运营的小伙伴提了个问题&#xff0c;她在后台上传图片的时候有时会遇到上传成功了&#xff0c;但实际回显图片却是一张“破图”&#xff1a; 二、原因调查 先了解一下ERR_HTTP2_PROTOCOL_ERROR是什么意思&#xff1a; ERR_HTTP2_PROTOCOL_ERROR是由HTTP/2协…