IO进程线程day5

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读《Generalizing Face Forgery Detection with High-frequency Features》

高频噪声分析会过滤掉图像的颜色内容信息。 本文设计了三个模块来充分利用高频特征&#xff0c; 1.多尺度高频特征提取模块 2.双跨模态注意模块 3.残差引导空间注意模块&#xff08;也在一定程度上体现了两个模态的交互&#xff09; SRM是用于过滤图像的高频噪声 输入的图…

AlexNet论文精读

1:该论文解决了什么问题&#xff1f; 图像分类问题 2&#xff1a;该论文的创新点&#xff1f; 使用了大的深的卷积神经网络进行图像分类&#xff1b;采用了两块GPU进行分布式训练&#xff1b;采用了Relu进行训练加速&#xff1b;采用局部归一化提高模型泛化能力&#xff1b;…

Linux 基于 rsync 实现集群分发脚本 xsync

一、rsync 简介 rsync&#xff08;remote synchronize&#xff09;是 Liunx/Unix 下的一个远程数据同步工具。它可以通过 LAN/WAN 快速同步多台主机间的文件和目录&#xff0c;并适当利用 rsync 算法&#xff08;差分编码&#xff09;以减少数据的传输。 rsync 算法并不是每一次…

Explain详解与索引最佳实践

听课问题(听完课自己查资料) type中常用类型详细解释 null <- system <- const <- er_ref <- ref <- range <- index <- all Explain 各列解释 EXPLAIN SELECT* FROMactorLEFT JOIN film_actor ON actor_id actor.id; 1. id 代表执行的先后顺序 比如…

如何对制作好的查询进行编辑和导出?

发布者已经创建好了查询&#xff0c;如发现数据有误&#xff0c;想要进行修改&#xff0c;或者想要将收集好的表格进行导出&#xff0c;应该如何操作&#xff1f;本次就来介绍如何使用此功能。 &#x1f4d6;案例&#xff1a;教师荣誉核对系统 在开启可修改列功能的教师荣誉核对…

Laravel 使用rdkafka_laravel详细教程(实操避坑)

一、选择rdkafka 首先要看版本兼容问题&#xff0c;我的是Laravel5.6&#xff0c;PHP是7.3.13&#xff0c;所以需要下载兼容此的rdkafka&#xff0c;去 Packagist 搜索 kafka &#xff0c;我用的是 Packagist选择里面0.10.5版本&#xff0c; 二、安装rdkafka 在 Laravel 项目…

宋仕强论道之华强北精神和文化(二十一)

华强北的精神会内化再提炼和升华成为华强北文化&#xff0c;在外部会流传下去和传播开来。在事实上的行动层面&#xff0c;就是华强北人的思维方式和行为习惯&#xff0c;即见到机会就奋不顾身敢闯敢赌&#xff0c;在看似没有机会的时候拼出机会&#xff0c;和经济学家哈耶克企…

RT-DETR 更换主干网络之 ShuffleNetv2 | 《ShuffleNet v2:高效卷积神经网络架构设计的实用指南》

目前,神经网络架构设计多以计算复杂度的间接度量——FLOPs为指导。然而,直接的度量,如速度,也取决于其他因素,如内存访问成本和平台特性。因此,这项工作建议评估目标平台上的直接度量,而不仅仅是考虑失败。在一系列控制实验的基础上,本文得出了一些有效设计网络的实用指…

NPS配置https访问web管理页面

因为NPS默认也支持http的访问&#xff0c;所以在部署完后就一直没在意这个事情。 因为服务器是暴露在公网内的&#xff0c;所以还是要安全一点才行。不然一旦远控的机器被破解了就很危险了 一、使用nginx反向代理访问 1、首先在nps的配置文件里关闭使用https选项&#xff0c;…

时间服务器

NTP --- 网络时间协议&#xff0c;基于UDP的123端口 Chronyd --- 后台守护进程&#xff0c;用于同步时间 服务端&#xff1a; server&#xff1a;192.168.146.129 1、安装服务软件 2、运行软件程序 3、根据自定配置提供对应的服务 ---vim /etc/chrony.conf 对 4&#xff0c;29 …

HarmonyOS@Provide装饰器和@Consume装饰器:与后代组件双向同步

Provide装饰器和Consume装饰器&#xff1a;与后代组件双向同步 Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传…

鸿蒙Harmony--状态管理器--双向同步@Link详解

你这一生最重要的责任&#xff0c;就是保护好自己脆弱的梦想&#xff0c;熬过被忽略的日子&#xff0c;就轮到你上场了。 如何解决大模型的「幻觉」问题&#xff1f; 目录 一&#xff0c;定义 二&#xff0c;装饰器使用规则说明 三&#xff0c;变量的传递/访问规则说明 四&…

Xcode15一个xcworkspace管理多个xcodeproj从零开始,一个主程序,多个子程序,一个主程序引用多个静态库

创建主程序&#xff1a;MainProject 目录结构&#xff1a; sandbox设置成NO&#xff1a;否则Xcode15不能运行 创建子程序 创建Framework 创建多个子程序后的目录结构 在主程序的Podfile中添加代码 # Uncomment the next line to define a global platform for your project pla…

python数据结构堆栈

堆 堆是一种树形结构&#xff1a;满足两个主要性质 堆是一种完全二叉树&#xff1a;堆中所有层级除了最后一层都是完全填满的&#xff0c;且最后一层的节点都是向左排列堆中的任意节点都不大于&#xff08;或不小于&#xff09;其子节点的值&#xff0c;这也是堆的属性 impo…

LCD—液晶显示中英文

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

行为型设计模式——模板方法模式

学习难度&#xff1a;⭐ &#xff0c;比较常用 模板方法模式 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0…

WEB之HTML练习

第一题&#xff1a;用户注册界面 HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

AlmaLinux 9.3 系统 安装配置 Zabbix6.4 监控系统(史上最全 小白都能看懂)

AlmaLinux 9.3 部署 Zabbix6.4 Zabbix安装部署 安装 Zabbix 源 rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm 清除缓存文件 dnf clean all 安装Zabbix server&#xff0c;Web前端&#xff0c;agent dnf install zabb…

Maven之私服

1 介绍 团队开发现状分析私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题Nexus Sonatype公司的一款maven私服产品 下载地址&#xff1a;https://help.sonatype.com/repomanager3/download win版安装包&#xff1a;https://pan.baidu.com/s/1wk…

酷开科技 | 酷开系统—探索科技新“玩法”

科技发展一日千里&#xff0c;智能家居逐渐成为人们享受舒适生活的重要途径之一。在这个背景下&#xff0c;酷开科技凭借其研发技术和创新能力&#xff0c;精心打造了酷开系统&#xff0c;引领行业潮流。现在&#xff0c;我们一起探索酷开系统的独特“玩法”。 01.智能家居一站…