IO进程线程day5

news2025/1/11 10:16:30

1.实现互斥机制

#include <head.h>

char buf[128];            //全局数组,临界资源

//1、创建一个互斥锁
pthread_mutex_t mutex;

//定义分支线程
void *task(void *arg)
{
    while(1)
    {
        //3、获取锁资源
        pthread_mutex_lock(&mutex);

        printf("分支线程中:buf = %s\n", buf);
        strcpy(buf, "I love China\n");

        //4、释放锁资源
        pthread_mutex_unlock(&mutex);
    }
}


int main(int argc, const char *argv[])
{
    //定义线程号变量
    pthread_t tid;

    //2、初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    //创建线程
    if(pthread_create(&tid, NULL, task, NULL) != 0)
    {
        printf("tid create error\n");
        return -1;
    }

    //主线程
    while(1)
    {
        //3、获取锁资源
        pthread_mutex_lock(&mutex);

        printf("主线程中buf = %s\n", buf);       //访问临界资源
        strcpy(buf, "hello world\n");  

        //4、释放锁资源
        pthread_mutex_unlock(&mutex);
    }
    


    pthread_join(tid, NULL);         //阻塞回收线程资源
    //5、销毁锁资源
    pthread_mutex_destroy(&mutex);

    return 0;
}

2.实现同步机制

#include <head.h>

//1、创建一个无名信号量
sem_t sem;

//生产者线程
void *task1(void *arg)
{
    while(1)
    {
        sleep(2);
        printf("我生产了一辆特斯拉\n");

        //4、释放资源
        sem_post(&sem);
    }
}

//消费者线程
void *task2(void *arg)
{
    while(1)
    {
        //3、申请资源,如果没有资源,则在该处阻塞
        sem_wait(&sem);

        printf("我消费了一辆特斯拉\n");
    }
}

int main(int argc, const char *argv[])
{
    //创建两个线程
    pthread_t tid1,tid2;

    //2、初始化无名信号量
    sem_init(&sem, 0, 0);
    //第一个0:表示用于线程之间的通信
    //第二个0:表示value初始值为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);

    //5、销毁无名信号量
    sem_destroy(&sem);

    return 0;
}

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

  1 #include <head.h>
  2 sem_t sem;
  3 struct Info
  4 {
  5     int fd1;
  6     int fd2;
  7     int size;
  8 };
  9
 10 void *task1(void *buf)
 11 {
 12     //不断得将源文件中的内容读出,并写入的目标文件中                                                                                                                                                       
 13     //直到源文件读取一半结束
 14     char buf1[1] = "";
 15     int count=0;
 16     lseek(((struct Info*)buf)->fd1,0,SEEK_SET);
 17     while(1)
 18     {
 19         memset(buf1, 0, sizeof(buf1));    //将容器清空
 20         int res = read(((struct Info*)buf)->fd1, buf1, sizeof(buf1));   //从源文件中读取数据
 21         count+=res;
 22         //对读取的数据个数进行判断
 23         if(count>((struct Info*)buf)->size/2)
 24         {
 25             break;
 26         }
 27         write(((struct Info*)buf)->fd2, buf1, res);     //将数据写入目标文件
 28     }sem_post(&sem);
 29     pthread_exit(NULL);
 30 }
 31 void *task2(void *buf)
 32 {
 33     sem_wait(&sem);
 34     lseek(((struct Info*)buf)->fd1,(((struct Info *)buf)->size)/2,SEEK_SET);
 35     //不断得将源文件中的内容读出,并写入的目标文件中
 36     //直到源文件读取后一半结束
 37     char buf2[128] = "";
 38     while(1)
 39     {
 40         memset(buf2, 0, sizeof(buf2));    //将容器清空
 41         int res = read(((struct Info *)buf)->fd1, buf2, sizeof(buf2));   //从源文件中读取数据
 42         //对读取的数据个数进行判断
 43         if(res==0)
 44         {
 45             break;
 46         }
 47         write(((struct Info*)buf)->fd2, buf2, res);     //将数据写入目标文件
 48     }
 49     pthread_exit(NULL);
 50 }
 51 int main(int argc, const char *argv[])
 52 {
 53     //判断传入的文件个数
 54     if(argc != 3)
 55     {
 56         printf("input file error\n");
 57         printf("usage:./a.out srcfile dstfile\n");
 58         return -1;
 59     }
 60     //定义文件描述符变量
 61     int fd1, fd2;
 62     //以只读的形式打开源文件
 63     if((fd1 = open(argv[1], O_RDONLY)) ==-1)
 64     {
 65         perror("open srcfile error");
 66         return -1;
 67     }
 68     //以只写的形式打开目标文件
 69     if((fd2 = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)
 70     {
 71         perror("open dstfile error");
 72         return -1;
 73     }
 74     sem_init(&sem, 0, 0);
 75     unsigned int size;
 76     size = lseek(fd1, 0, SEEK_END);
 77     struct Info buf = {fd1, fd2, size};
 78     //定义一个线程号变量
 79     pthread_t tid1,tid2;
 80     //创建出一个分支线程
 81     if(pthread_create(&tid1, NULL, task1, &buf) != 0)
 82     {
 83         printf("tid create error\n");
 84         return -1;
 85     }
 86     if(pthread_create(&tid2, NULL, task2, &buf) != 0)
 87     {
 88         printf("tid create error\n");
 89         return -1;
 90     }
 91     pthread_join(tid1, NULL);
 92     pthread_join(tid2, NULL);
 93     sem_destroy(&sem);
 94     close(fd1);
 95     close(fd2);
 96     return 0;
 97 }

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

#include <head.h>
sem_t sem1,sem2,sem3;//无名信号量

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);
	}
}
int main(int argc, const char *argv[])
{
	//无名信号量初始化
	sem_init(&sem1,0,1);
	sem_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;
}

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

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

相关文章

Oracle-探究统计信息收集自动采样AUTO_SAMPLE_SIZE

前言&#xff1a; Oracle数据库进行统计信息收集时&#xff0c;可以通过ESTIMATE_PERCENT参数指定采样方式或者比例&#xff0c;有以下4种指定的方式 1 统计信息收集时不指定值&#xff0c;这时候ESTIMATE_PERCENT值为默认值DBMS_STATS.AUTO_SAMPLE_SIZE&#xff0c;自动采样 …

ApolloCarla联合仿真基本操作

Apollo 系统架构 CANBus&#xff1a;对接车辆的底盘&#xff0c;做一些数据的收发&#xff0c;如油门&#xff0c;方向盘转角 HDMap&#xff1a; 给localization提供定位图层的信息给perception一些车道线、道路拓扑、红绿灯的信息&#xff08;超时空感知&#xff09;&#x…

一台Linux服务jdk1.6 与 jdk1.8 并存,tomcat6+tomcat8 并存

Linux jdk1.6,1.8 tomcat6 tomcat8 并存 需求场景&#xff1a; 有一个项目 原来是 jdk1.6tomcat6 部署的&#xff0c;现在需要进行项目架构升级 项目需要适配jdk1.8 然后用 jdk.8 tomcat 8进行部署&#xff0c;然后下架 jdk1.6 的linux服务 现在有一台 jdk.8 tomcat 8的linu…

【办公软件】手机当电脑摄像头Iriun Webcam软件安装与试用

家里电脑是台式的没有摄像头&#xff0c;但老安卓手机有一台。本来想用小爱摄像头做电脑摄像头&#xff0c;但是发现像素有点差&#xff0c;捣鼓了半天没成功。看网上别人都用旧手机来当电脑摄像头&#xff0c;并且也能使用音频&#xff0c;所以还是用旧手机做摄像头比较香。 …

Java 常见缓存详解以及解决方案

一. 演示Mybatis 一级缓存 首先我们准备一个接口 两个实现的方法&#xff0c; 当我们调用这个queryAll&#xff08;&#xff09;方法时我们需要调用selectAll&#xff08;&#xff09;方法来查询数据 调用此接口实现效果 这个时候我们就可以发现了问题&#xff0c;我们调用方法…

车速预测 | Matlab基于RBF径向基神经网络的车速预测模型(多步预测,尾巴图)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 车速预测 | Matlab基于RBF径向基神经网络的车速预测模型&#xff08;多步预测&#xff0c;尾巴图&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于RBF径向基神经网络的车速预测模型…

电脑重装系统有什么好处和坏处?利弊分析

在数字时代&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。随着时间的推移&#xff0c;电脑可能会出现各种问题&#xff0c;如运行缓慢、软件冲突、病毒侵入等。此时&#xff0c;许多人会选择重装系统作为解决问题的方法。重装系统既有好处也有坏处。本文将深入探…

GC6109——双通道5V低电压步进电机驱动芯片,低噪声、低振动,应用摄像机,机器人等产品中

GC6109是双通道5V低电压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机的变焦和对焦系统&#xff0c;万向节和其他精密、低噪声的STM控制系统。该芯片为每个通道集成了256微步驱动器。带SPl接口&#xff0c;用户可以方便地调整驱动器的参数。内…

Java版直播商城:电商源码、小程序、三级分销及 免 费 搭 建 方案

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

Elasticsearch windows开箱即用【记录】

一、准备工作 安装ES之前要在本机安装好JDK&#xff0c;对应的兼容性见官网链接&#xff1a;https://www.elastic.co/cn/support/matrix ES官网链接&#xff1a;https://www.elastic.co/cn/, 我本机安装的是JDK8&#xff0c;测试使用的是7.3.0版本的ES和Kibana。 1、首先去…

【2024最新-python3小白零基础入门】No3.python六大数据类型学习

文章目录 前言一、 Number&#xff08;数字&#xff09;1.1 数字类型分类1.2 数字类型转换1.3 数字运算 二、 String&#xff08;字符串&#xff09;2.1 字符串的创建&#xff1a; 2.2 字符串的基本操作&#xff1a;2.3 字符串常用方法&#xff1a; 三、 List&#xff08;列表&…

Vulnhub靶机:Corrosion 2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;corrosion:2&#xff08;10.0.2.13&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/c…

Python教程39:使用turtle画美国队长盾牌

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

大创项目推荐 深度学习手势检测与识别算法 - opencv python

文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…

iOS14 Widget 小组件调研

桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据&#xff0c;“一般用户每天进入主屏幕的次数超过90次”&#xff0c;如果有一个我们应用的小组件在桌面&#xff0c;每天都有超过90次曝光在用户眼前的机会&#xff0c;这绝对是一个顶级的流量入口。 “…

LCD—液晶显示中英文

本节主要介绍以下内容&#xff1a; 字符编码 字模 各种模式的液晶显示字符实验 本节字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 Unicode官网&#xff1a;http://www.unicode.org。 一、字符编码 由于计算机只能识别0和1&#xff0c;文字…

TensorFlow相关组件的安装

安装Anaconda3 安装Anaconda3的时候可以安装在任意磁盘中&#xff0c;在勾选path的时候全部勾选即可。更换Anaconda3的下载源为清华大学源&#xff0c;在此期间不要打开Anaconda3&#xff0c;在cmd中依次输入以下即可&#xff1a; conda config --add channels https://mirro…

基于TI TPSXX系列 Buck电路应用计算-外围器件详细计算过程

TPS54202 Buck电路应用计算 1、电气特性2、内部框图3、典型应用电路4、设计需求5、计算EN引脚电阻6、FB引脚电阻估算7、查看反馈电压电压基准8、输入电容计算10、FB引脚反馈电阻计算11、功率电感计算12、输出电容计算13、前馈电容计算15、Layout布局 TPS54202-中文版 1、电气特…

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架&#xff0c;它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化&#xff0c;它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例&#xff0c;从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

招投标系统是Electron的纯内网编辑Office Word,可以设置部分区域可编辑,其他的地方不能编辑吗?

问题&#xff1a; 我们是招投标系统的开发公司&#xff0c;框架是用的Electron&#xff0c;需要在纯内网的环境下编辑Office Word&#xff0c;可以设置部分区域可编辑&#xff0c;其他的地方不能编辑吗&#xff08;如下红框位置&#xff09;并且在用户忘记填写一些区域的时候做…