DAY6 线程

news2024/12/23 10:54:13

作业1:

        多线程实现文件拷贝,线程1拷贝一半,线程2拷贝另一半,主线程回收子线程资源。

代码:

#include <myhead.h>
sem_t sem1;
void *copy1()//子线程1函数 拷贝前一半内容
{
	int fd1=open("./1.txt",O_RDONLY);
	int fd2=open("./2.txt",O_CREAT|O_RDWR|O_APPEND,0664);
	if(fd1==-1)
	{
		perror("open");
	}
	if(fd2==-1)
	{
		perror("open");
	}
	char s[100];
	int sum1=0,res1=0;
	int len=lseek(fd1,0,SEEK_END);//统计文件字节数
	lseek(fd1,0,SEEK_SET);//统计完光标要返回
	while(1)
	{
		res1=read(fd1,s,sizeof(s));
		sum1+=res1;//每读一次,把读取长度加起来
		if(res1==0||sum1>len/2)
		{
			int k=res1-(sum1-len/2);//该次读取字节数-超过len/2的字节数
			write(fd2,s,k);
			break;
		}
		write(fd2,s,sizeof(s));//把读取到的字节写入2.txt
	}
	printf("线程1拷贝完成\n");
	close(fd1);
	close(fd2);
	sem_post(&sem1);
	pthread_exit(NULL);
}
void *copy2()//子线程2函数  拷贝后一半内容
{
	sem_wait(&sem1);
	int fd1=open("./1.txt",O_RDONLY);
	int fd2=open("./2.txt",O_CREAT|O_RDWR|O_APPEND,0664);
	if(fd1==-1)
	{
		perror("open");
	}
	if(fd2==-1)
	{
		perror("open");
	}
	int fd3;
	int res2=0;
	int len=lseek(fd1,0,SEEK_END);//统计文件字节数
	lseek(fd1,0,SEEK_SET);//统计完光标要返回
	dup2(fd1,fd3);//fd3重定向fd1
	lseek(fd3,len/2,SEEK_SET);//fd3光标移动中间
	char s[100];
	while(1)
	{
		res2=read(fd3,s,sizeof(s));
		if(res2==0)
		{
			break;
		}
		write(fd2,s,res2);
	}
	printf("线程2拷贝完成\n");
	close(fd1);
	close(fd2);
	close(fd3);
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2;
	sem_init(&sem1,0,0);
	if(pthread_create(&tid1,NULL,copy1,NULL))
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid2,NULL,copy2,NULL))
	{
		perror("pthread_create");
		return -1;
	}
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	printf("回收完成\n");
	sem_destroy(&sem1);
	return 0;
}

运行测试结果:

作业2:线程同步之条件变量

        生产者先让消费者组成一个队列,生产者生产了一台劳斯莱斯,唤醒第一个消费者来消费,然后再生产第二台劳斯莱斯,唤醒第二个消费者来消费,这样可以精确化的控制生产者线程和消费者线程的协同

代码:

#include <myhead.h>
#define MAX 10
pthread_cond_t cond;
pthread_mutex_t mtx;
sem_t sem;
int n=0,count=0;
void *producer()
{
	for(int i=0;i<MAX;i++)
	{
		sem_wait(&sem);//用条件变量卡一下
		n++;
		printf("生产了一台特斯拉%d\n",n);
		pthread_cond_signal(&cond);//唤醒一个等待线程
	}
	pthread_exit(NULL);
}
void *consumer()
{
	pthread_mutex_lock(&mtx);//进入后锁住
	pthread_cond_wait(&cond,&mtx);//条件变量每接受一次进入后重新上锁
	count++;
	printf("消费了一台特斯拉%d\n",count);
	usleep(200000);
	pthread_mutex_unlock(&mtx);
	sem_post(&sem);//条件变量放行
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2[MAX];
	pthread_cond_init(&cond,NULL);//条件变量
	pthread_mutex_init(&mtx,NULL);//互斥锁
	sem_init(&sem,0,1);//条件变量
	if(pthread_create(&tid1,NULL,producer,NULL)!=0)
	{
		perror("pthread_create");
		return -1;
	}
	for(int i=0;i<MAX;i++)
	{
		if(pthread_create(&tid2[i],NULL,consumer,NULL)!=0)
		{
			perror("pthread_create");
			return -1; 
		}
	}
	pthread_join(tid1,NULL);
	for(int i=0;i<MAX;i++)
	{
		pthread_join(tid2[i],NULL);
	}
	pthread_mutex_destroy(&mtx);
	pthread_cond_destroy(&cond);
	return 0;
}

运行测试结果:

作业3:

互斥锁,无名信号量,条件变量再练习一遍

1.互斥锁代码如何实现

代码:

#include <myhead.h>
pthread_mutex_t mtx;//定义互斥锁
void *fun(void *n)
{
	pthread_mutex_lock(&mtx);//上锁
	printf("%d\n",*(int *)n);
	pthread_mutex_unlock(&mtx);//解锁
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2;
	int num1=1,num2=2;
	pthread_mutex_init(&mtx,NULL);//初始化互斥锁
	if(pthread_create(&tid1,NULL,fun,&num1))//子线程1
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid2,NULL,fun,&num2))//子线程2
	{
		perror("pthread_create");
		return -1;
	}
	pthread_join(tid1,NULL);//阻塞回收线程
	pthread_join(tid2,NULL);
	pthread_mutex_destroy(&mtx);//毁锁
	return 0;
}

运行测试结果:

2.无名信号量

代码:

#include <myhead.h>
#define MAX 5
sem_t sem;//定义无名信号量
int n=0;
void *producer()
{
	for(int i=0;i<MAX;i++)
	{
	   n++;
       printf("生产了特斯拉%d\n",n);
	}
	sem_post(&sem);//释放无名变量
	pthread_exit(NULL);
}
void *consumer()
{
    sem_wait(&sem);//申请无名变量
	printf("消费了一台特斯拉%d\n",n);
	n--;
	sem_post(&sem);
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid[MAX];
	sem_init(&sem,0,0);//初始化无名信号量
	if(pthread_create(&tid1,NULL,producer,&n)!=0)
	{
		perror("pthread_create");
		return -1;
	}
	for(int i=0;i<MAX;i++)
	{
		if(pthread_create(&tid[i],NULL,consumer,&n)!=0)
		{
			perror("pthread_create");
			return -1;
		}
	}
	pthread_join(tid1,NULL);
	for(int i=0;i<MAX;i++)
	{
		pthread_join(tid[i],NULL);
	}
	sem_destroy(&sem);//销毁无名变量
	return 0;
}

运行测试结果:

3.条件变量

见作业2

Xmind知识点:

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

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

相关文章

# filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝, 失败,无法连接服务器”解决方案

filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝&#xff0c; 失败&#xff0c;无法连接服务器”解决方案 一、问题描述&#xff1a; 当我们用filezilla客户端 连接 虚拟机ubuntu系统时&#xff0c;报错“尝试连接 ECONNREFUSED - 连接被服务…

网安数学基础-同余关系

文章目录 参考等价关系实例 同余同余和等价同余的运算 乘法逆元一次同余方程消去律 剩余类中国剩余定理欧拉函数欧拉定理 费马小定理 参考 【一口气学完】密码学的数学基础2&#xff0c;《同余关系》&#xff0c;一小时学完 等价关系 三角形里的全等关系 等价关系定义 下面这…

高校数字校园建设的数字身份管理难题

近年来&#xff0c;我国高等院校在《中国教育现代化2035》战略的要求下&#xff0c;在《高等学校数字校园建设规范&#xff08;试行&#xff09;》的指引下&#xff0c;掀起了数字校园建设高潮。借助教学、科研、管理、服务等种类的业务应用&#xff0c;高校提升了业务的数字化…

HDLC和PPP原理与配置

HDLC:高级数据链路控制 PPP:点到点协议 PPP:包括LCP链路控制协议,用于各种链路协议层参数的协商内容包括最大接收单元MRU,认证方式,魔术字等选项. NCP:网络控制协议,用于各网络层参数的协商,更好地支持了网络层协议. PAP:口令认证. CHAP:质询握手认证协议 PPP有两种验证方式…

Oracle数据库 查看SQL执行计划的几种方法

前言 在日常的运维工作中&#xff0c;SQL优化是DBA的进阶技能&#xff0c;SQL优化的前提是要看SQL的执行计划是否正确&#xff0c;下面分享几种查看执行计划的方法&#xff0c;每一种方法都各有各的好处&#xff0c;可以根据特定场景选择某种方法。 一.使用AUTOTRACE查看执行…

Hbase Shell

一、启动运行HBase 首先登陆SSH&#xff0c;由于之前在Hadoop的安装和使用中已经设置了无密码登录&#xff0c;因此这里不需要密码。然后&#xff0c;切换至/usr/local/hadoop&#xff0c;启动Hadoop&#xff0c;让HDFS进入运行状态&#xff0c;从而可以为HBase存储数据&#…

31-2 智能驾驶系统

智能驾驶功能分类 安全类功能 纵向 FCW/AEB FCTA/FCTB/RCTA/RCTB RVW/RVB 横向 ESA LSS LKA/LDW/ELK 盲区安全辅助 BSD LCA DOW CVW 舒适功能类 纵向 ACC CSA TSR ISA 横向 LCC ILC ALC 横纵向 TJA/HWA NOP 泊车功能 RAP 蓝牙通信&#xff0c;环视超车波 HPA 记忆泊车…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 dependencies:- cudatoolkit11.6- plyfile0.8.1- python3.7.13- pip22.3.1- pytorch1.12.1- torchaudio0.12.1- torchvision0.13.1- tqdm1. 安装conda创建环境 conda create -n lod-3dgs python3.7.132. 安装CUDA11.6和相应cuDNN。 2.1 CUDA CUDA安装参考CUDA10.1…

Linux:网络协议socket

我们之前学的通信是本地进程间通信&#xff0c;如果我们想在网络间通信的话&#xff0c;就需要用到二者的ip地址&#xff0c;分别被称为源IP地址和目的IP地址&#xff0c;被存入ip数据包中&#xff0c;其次我们还需要遵循一些通信协议。 TCP协议&#xff1a;传输层协议&#x…

Leetcode - 143双周赛

目录 一&#xff0c;3345. 最小可整除数位乘积 I 二&#xff0c;3346. 执行操作后元素的最高频率 I 1.差分数组 2.同向三指针 滑动窗口 三&#xff0c; 3348. 最小可整除数位乘积 II 一&#xff0c;3345. 最小可整除数位乘积 I 本题直接暴力枚举&#xff0c;题目求 >n…

Springboot3 配置Swargger3.0版本

一、swagger 版本配置&#xff0c;我用的3.0.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency>二、说明&#xff1a;springdo…

error MSB3325:无法导入以下密钥文件xxx,该密钥文件可能受密码保护

错误提示信息(类似如下)&#xff1a; error MSB3325: 无法导入以下密钥文件: F:\...\Common.pfx。该密钥文件可能受密码保护。若要更正此问题&#xff0c;请尝试再次导入证书&#xff0c;或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_A65F207BE95F57D0 出现此…

喜报|超维机器人荣获昇腾AI创新大赛铜奖

近日&#xff0c;在备受瞩目的昇腾AI创新大赛中&#xff0c;超维机器人凭借扎实的技术实力和创新产品&#xff0c;荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破&#xff0c;也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…

[[nodiscard]] 使用说明

1 作用 [[nodiscard]] 属性&#xff1a;这个属性可以用于函数或者返回类型。它的作用是告诉编译器&#xff1a;调用这个函数时&#xff0c;它的返回值不应被忽略。如果程序员调用了这样的函数但没有使用它的返回值&#xff0c;编译器会发出警告。这对于那些返回重要状态或错误…

golang分布式缓存项目 Day4 一致性哈希

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习 为什么使用一致性哈希 我该访问谁 对于分布式缓存来说&#xff0c;当一个节点接收到请求&#xff0c;如…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

UE5 umg学习(四) 将UI控件切换到关卡中

视频资料 7、将UI控件渲染到关卡_哔哩哔哩_bilibili 在前三节里&#xff0c;创建了用户的控件蓝图Widget_BP 目标是运行的时候&#xff0c;开始运行这个蓝图&#xff0c;因此需要在开始事件触发运行 首先&#xff0c;回到主页&#xff0c;点击关卡蓝图 要从事件开始运行时 …

React Hooks在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

军工行业运维:监控易引领自主可控新潮流

在军工行业&#xff0c;信息安全和技术创新始终是发展的重中之重。随着信息化建设的不断深入&#xff0c;对监控产品的要求也日益严格。 监控易作为一款高性能、全面性的运维监控解决方案&#xff0c;凭借其国产化、自主可控的特性&#xff0c;以及对军工行业特殊需求的深刻理解…