线程基础和线程间通信

news2025/7/7 3:57:20

作业一:创建3个线程,一个子线程拷贝文件的前一半,一个子线程拷贝后一半文件,主线程回收子线程资源。

#include <myhead.h>
//定义结构体变量
typedef struct
{
    const char *src_file;
    const char *dest_file;
    int start;
    int end;
} Copy;
//计算长度和创建目标文件
int get_len(const char *p1, const char *p2)
{
    int fd1 = open(p1, O_RDONLY); //打开源文件
    if (fd1 == -1)
    {
        perror("open1");
        return -1;
    }
    int fd2 = open(p2, O_WRONLY | O_CREAT | O_TRUNC, 0664); //打开创建目标文件
    if (fd1 == -1)
    {
        perror("open1");
        return -1;
    }
    int len = lseek(fd1, 0, SEEK_END); //计算源文件长度
    close(fd1);
    close(fd2);
    return len;
}
//定义写入函数
void *copy_file(void *file)
{
    Copy *td = (Copy *)file;
    int src_fd = open(td->src_file, O_RDONLY);
    int dest_fd = open(td->dest_file, O_WRONLY); //已只写打开目标文件
    if (src_fd == -1 || dest_fd == -1)
    {
        perror("open");
        return NULL;
    }
    lseek(src_fd, td->start, SEEK_SET); //移动光标到目标位置
    lseek(dest_fd, td->start, SEEK_SET);
    char buff[5];
    int index;
    while (td->start < td->end && (index = read(src_fd, buff, sizeof(buff))) > 0) //当start>end或没有读的元素退出循环
    {
        int temp = (td->start + index > td->end) ? td->end - td->start : index; //判断应该写入的个数
        write(dest_fd, buff, temp);
        td->start += temp;
    }
    close(src_fd);
    close(dest_fd);
	pthread_exit(NULL);
}

/*********************/
int main(int argc, const char *argv[])
{
    if (argc != 3)
    {
        fprintf(stderr, "%s 源文件 目标文件", argv[0]);
        return -1;
    }
    const char *src_file = argv[1];
    const char *dest_file = argv[2];
    int len = get_len(src_file, dest_file);
    int mid = len / 2; //寻找中间位置
    Copy td[2] = {{src_file, dest_file, 0, mid},{src_file, dest_file, mid, len}};//创建结构体数组并初始化
    pthread_t tid[2];
    for (int i = 0; i < 2; i++)
    {
        if(0 !=pthread_create(&tid[i],NULL,copy_file,&td[i]))//创建两个线程
        {
            perror("pcreat");
            return -1;
        }
    }
    for (int i = 0; i < 2; i++)//回收线程资源
    {
        pthread_join(tid[i], NULL);
    }

    printf("拷贝完成\n");
    pthread_exit(NULL);
}


作业二:使用无名信号量实现循环输出 春、夏、秋、冬。

#include <myhead.h>
sem_t sem1,sem2,sem3,sem4;//定义四个无名信号量
void *fun1(void *ggg)
{
	while(1)
	{
		sem_wait(&sem4);
		sleep(1);
		printf("春\t");//写入
		fflush(stdout);//刷新缓存区
		sem_post(&sem3);
	}
	pthread_exit(NULL);
}
void *fun2(void *ggg)
{
	while(1)
	{
		sem_wait(&sem3);
		sleep(1);
		printf("夏\t");
		fflush(stdout);
		sem_post(&sem2);
	}
	pthread_exit(NULL);
}
void *fun3(void *ggg)
{
	while(1)
	{
		sem_wait(&sem2);
		sleep(1);
		printf("秋\t");
		fflush(stdout);
		sem_post(&sem1);
	}
	pthread_exit(NULL);
}
void *fun4(void *ggg)
{
	while(1)
	{
		sem_wait(&sem1);
		sleep(1);
		printf("冬\t");
		fflush(stdout);
		sem_post(&sem4);
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2,tid3,tid4;
	sem_init(&sem1,0,0);
	sem_init(&sem2,0,0);
    sem_init(&sem3,0,0);
	sem_init(&sem4,0,1);//信号4先给线程1资源
	if(pthread_create(&tid1,NULL,fun1,NULL)!=0)//定义输出春的函数体
	{
		perror("ptcreat1");
		return -1;
	}
	if(pthread_create(&tid2,NULL,fun2,NULL)!=0)
	{
		perror("ptcreat2");
		return -1;
	}
	if(pthread_create(&tid3,NULL,fun3,NULL)!=0)
	{
		perror("ptcreat3");
		return -1;
	}
    if(pthread_create(&tid4,NULL,fun4,NULL)!=0)
	{
		perror("ptcreat3");
		return -1;
	}
    sem_destroy(&sem1);//销毁信号量
    sem_destroy(&sem2);
    sem_destroy(&sem3);
    sem_destroy(&sem4);
	pthread_join(tid1,NULL);//回收资源
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
    pthread_join(tid4,NULL);
	return 0;
}


作业三:互斥锁,无名信号量,条件变量再联系一遍。

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

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

相关文章

IAR软件配置笔记

Project->Optiions->配置Device Debug中配置 C/C Compiler中配置 优化等级 C语法标准选择 回到主界面&#xff0c;Tools->Options 字体调整 Editor更改缩进数 Project->Make编译 调试模式和编辑模式的View菜单栏不一样http://t.csdnimg.cn/JsWjy

百度网盘下载的文件怎么打印?

一、自有打印机情况下的打印方法 如果您家中或办公室配备有打印机&#xff0c;那么打印百度网盘上的文件就变得非常简单了。首先&#xff0c;请确保您的打印机已连接并设置妥当。以下是基本的操作流程&#xff1a; 下载文件&#xff1a;从百度网盘中下载所需的文件至您的计算…

关于重复消费的一些解决方案

重复消费问题一直是一个热点问题&#xff0c;不管是面试还是实际工作过程中都会遇到&#xff0c;今天我就盘一下这个问题。 1. 重复消费是怎么出现的 重复消费的问题出现的情况有很多&#xff0c;我列举一下常见的吧&#xff1a; 用户重复提交表单。 用户使用软件恶意刷单。…

【Qt】基于VTK9.1+VS2019+Qt5.15.2的点云可视化程序开发

目录 0. 写在前面 1. 开发环境 2. VS 2019 PCL 1.12.1 配置 3. Qt 5.15.2安装 & Qt-VS插件安装 & VTK 9.1.0编译安装 4. 点云显示demo 4.1 UI 4.2 头文件 4.3 主程序 4.4 显示效果 5. 写在最后 0. 写在前面 由于工作需要和个人爱好&#xff0c;我最近在学习…

lenovo M7328W 复印二页不同的内容到同一张白纸上,要求要全都是正向,就是一个方向显示。当然也可以不一样,那就随便放不要求正反,只要求位置一致。

1、先上个图&#xff0c;打开软件&#xff1a; 按一下电源键&#xff0c;将休眠中的打印机&#xff0c;变成待机状态&#xff0c;这样才可以复印。 2、打开复印的盖板&#xff0c;将要复印的一面帖在最右侧&#xff0c;右侧要留一些空白距离&#xff0c;然后点击复印按钮&#…

数据存储单位——真题详解

在计算机中&#xff0c;以下哪个选项描述的数据存储容量最小?( ) A. 字节(byte) B. 比特(bit) C. 字(word) D. 千字节(kilobyte) 【答案】 B 【解析】 本题考查计算机数据存储容量单位的比较&#xff0c;这个题目看起来很简单&#xff0c;但有的老师甚至都会做错&am…

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题——(共九套)(每套四十题)

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题-题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——数字芯片 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&am…

天下通商城:数字时代的智能消费助手

随着数字经济的飞速发展&#xff0c;消费方式也在不断革新。天下通网络科技&#xff08;海南&#xff09;有限公司顺应这一趋势&#xff0c;推出了天下通商城&#xff0c;这一平台不仅简化了购物流程&#xff0c;还为用户提供了丰富的智能消费工具&#xff0c;成为现代消费者的…

解决国产手机wda不能联网问题

前言 国产手机在通过tidevice无线调试启动wda&#xff08;webdriveragent&#xff09;后&#xff0c;会有报错&#xff1a; request error:(‘Connectionaborted.’, SocketError(‘socket timeout’))AirtestIDE或者appnium inspector 无法连接手机显示模拟器界面&#xff0c…

音频导出后为什么效果变差了 FL Studio音频导出设置推荐

FL Studio是一款功能强大的编曲软件&#xff0c;除了可以编曲之外&#xff0c;FL Studio还支持各种音频格式导出。有的小伙伴在使用FL Studio导出音频后&#xff0c;会发现的导出的音频效果不理想&#xff0c;这很大的原因可能是导出设置不对造成的。下面给大家详细讲解&#x…

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图 2024/8/27 19:40 缘起&#xff0c;我司使用飞凌的OK3588-C的核心板&#xff0c;系统是Linux R4版本。 机芯选用SONY索尼的HDMI OUT接口的8530&#xff0c;输出格式有BGR3/NV16。…

CMake之PUBLIC、PRIVATE、INTERFACE

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面抽象版解释头文件和链接库传递测试代码结构PUBLIC传递PRIVATE传递INTERFACE传递 写在前面 使用CMake必然离不开target_include_dir…

LVGL从SD卡读取图片并显示到MCU LCD屏详细笔记教程

1、前言 在上一篇LVGL专题文章中已经讲解了如何将LVGL与FatFs链接起来&#xff0c;实现LVGL对SD卡中的数据进行读写操作。本文在上一文的基础上&#xff0c;将实现LVGL读取文件系统中的图片文件&#xff08;BMP、PNG、JPG&#xff09;&#xff0c;并显示到MCU设备中的LCD屏中。…

转行软件测试必需要知道的知识

1前言 随着现在互联网行业的迅猛发展&#xff0c;越来越多的人想涌入进来&#xff0c;因为大家都觉得IT行业工资高&#xff0c;做测试门槛又低&#xff0c;是的&#xff0c;入门门槛确实比较低&#xff0c;但是要做好的话&#xff0c;还是有点难的&#xff0c;毕竟术业有专攻嘛…

网约车资格证考试攻略(必备宝典)

考试分数详情及攻略如下&#xff1a; 一、理论部分&#xff1a;&#xff08;电脑操作&#xff0c;鼠标勾选&#xff09; 1、全国试题&#xff0c;满分50分&#xff0c;40分过关&#xff0c;每位学员要练习到45分才行&#xff1b; 2、地方试题&#xff0c;满分25分&#xff0c…

Vue3源码调试-第三篇

前言 上两篇已经调试完packages/runtime-dom/src/index.ts下的createApp函数的第一行了&#xff0c;接下来我们看下一行 injectNativeTagCheck 首先说下这个__DEV__估计也是定义在dev.js下&#xff0c;又或者是哪里的&#xff0c;这里控制台输出是true&#xff0c;那我估计是…

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图 当用户发过来一个request body的时候&#xff0c;Nginx 是如何处理这样一个body这个body 它对应的就是我们客户请求的一些具体内容 1 &#xff09;proxy_request_bufering 指令 接收包体的两种方式 接收完全部包体再发送一边接收包体一边发送 接收包体的两种…

前端项目部署到服务器上(nginx)

我这个之前已经部署过项目&#xff0c;所以要进行这个操作 docker imagedocker rm -f nginx //用于强制删除名为“nginx”的容器docker ps //用于列出当前正在运行的Docker容器docker volume -fdocker volume prune //用于删除所有未使用的Docker数据卷&#xff0c;‌释放存…

day11JS-面向对象和js中的设计模式

1. 面向对象 1.1 什么是面向对象 面向对象是一种编程思想&#xff0c;JS就是基于这个思想构建出来的一门编程语言&#xff0c;所以JS中存在对象、类、实例的概念。 对象&#xff1a;万物皆对象。 构造函数&#xff08;类&#xff09;&#xff1a;把具有某一特征的内容可以划分…

穿梭虚实之间:3DGS与NeRF如何辅助机器人遥控操作?

导读&#xff1a; 本研究介绍了一种用于机器人遥控操作的新型辐射场可视化技术&#xff0c;研究者提出了一种在线训练辐射场的方法&#xff0c;能够实时从多个摄像头获取数据&#xff0c;支持多种辐射方法&#xff0c;包括NeRF和3DGS。该系统与现有的ROS遥控操作系统集成&#…