嵌入式入门Day30

IO Day5

  • 线程
    • 相关函数
      • `pthread_create`
      • `pthread_self`
      • `pthread_exit`
      • `pthread_join\pthread_detach`
      • `pthread_cancel`
      • `pthread_setcancelstate`
      • `pthread_setcanceltype`
  • 作业

在这里插入图片描述

线程

  1. 线程是轻量化的进程,一个进程内可以有多个线程,至少包含一个线程(主线程)。
  2. 线程的任务调度,创建,销毁的开销都要比进程小。
  3. 进程之间不共享资源,进程运行空间都是独立的,但是线程共享临界资源。
  4. 线程是任务调度的最小单位,进程是资源分配的最小单位。
  5. 多任务并发执行大多数选择多线程,而不是多进程,因为线程占用内存非常少大概8K。
  6. 多个线程每一个都有自己的id号。
  7. 线程函数来自于第三方库,-pthread,所以要编译线程库函数需要加上 -pthread
  8. 多线程编程时,对于临界资源访问时可能有多个线程同时访问,这样会产生数据的错乱,这种现象被称为竞态。
  9. 临界资源:全局变量,临界区:访问临界资源的代码。

相关函数

pthread_create

#include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr, *(*start_routine) (void *), void *arg);
功能:创建子线程的函数
参数1:存储创建的子线程号
参数2:创建时附加的线程属性,默认填NULL
参数3:函数指针,子线程的线程体函数,也是子线程开始运行的地方。
参数4:是线程体函数的参数,如果没有参数填NULL即可。
返回值:成功返回0,失败返回-1,并且线程号不确定。

pthread_self

#include <pthread.h>

       pthread_t pthread_self(void);
        功能:获取调用线程的线程号
        参数:无
        返回值:返回调用线程的线程号。

pthread_exit

#include <pthread.h>

       void pthread_exit(void *retval);
        功能:退出调用线程
        参数:任意类型的变量,存储检索后的内容。
        返回值:无

pthread_join\pthread_detach

#include <pthread.h>

       int pthread_join(pthread_t thread, void **retval);
        功能:阻塞回收子线程的资源。
        参数1:要退出的线程号
        参数2:线程退出时的状态,一般不接收填NULL。
        返回值:成功返回0,失败返回一个错误码。
        
        #include <pthread.h>

       int pthread_detach(pthread_t thread);
        功能:非阻塞将线程设置为分离态,设置为分离态的线程由系统回收资源。
        参数:要设置为分离态的线程号
        返回值:成功返回0,失败返回一个错误码。

pthread_cancel

#include <pthread.h>

       int pthread_cancel(pthread_t thread);
       功能:向线程发送取消信号。
       参数:线程号
       返回值:成功返回0,失败返回非0错误码。

pthread_setcancelstate

#include <pthread.h>

       int pthread_setcancelstate(int state, int *oldstate);
       功能:设置调用线程是否可被取消
       参数1:
       PTHREAD_CANCEL_ENABLE:默认线程可被取消
       PTHREAD_CANCEL_DISABLE:线程不可被取消
       参数2:线程原始的状态。
       返回值:成功返回0,失败返回非0错误码。

pthread_setcanceltype

#include <pthread.h>
		int pthread_setcanceltype(int type, int *oldtype);
        功能:设置线程延迟取消。
        参数1:
        PTHREAD_CANCEL_DEFERRED:默认延迟取消
        PTHREAD_CANCEL_ASYNCHRONOUS:不延迟,立刻取消。
        参数2:线程原始的类型。
        返回值:成功返回0,失败返回非0错误码。

作业

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

#include <myhead.h>

void *fun1(void *len)
{
	int fd1, fd2;
	fd1 = open("./1.txt", O_RDONLY); 		//只读打开文件1
	if (fd1 == -1)
	{
		perror("open");
		pthread_exit(NULL);
	}
	fd2 = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664); 	//只写打开文件2
	if (fd2 == -1)
	{
		perror("open");
		pthread_exit(NULL);
	}
		

	char buff[100]; 	//存储数据
	int sum = 0; 		//写入计数

	while (1)
	{
		int res = read(fd1, buff, sizeof(buff)); 		//读取数据
		sum += res; 									//计数累加
		if (res == 0 || sum > *(int *)len/2) 				//读取结束或者超过一半
		{
			write(fd2, buff, res - (sum - *(int *)len/2)); 		//写入未超过一半的剩余数据
			break;
		}
		write(fd2, buff, res);  						//正常写入数据
	}
	close(fd1); 	//关闭文件描述符
	close(fd2);
	pthread_exit(NULL);
}

void *fun2(void *len)
{
	sleep(1); 			//防止线程产生竞态
	int fd1, fd2;
	fd1 = open("./1.txt", O_RDONLY); 		//只读打开文件1
	if (fd1 == -1)
	{
		perror("open");
		pthread_exit(NULL);
	}
	fd2 = open("./2.txt", O_WRONLY | O_CREAT, 0664); 	//只写打开文件2
	if (fd2 == -1)
	{
		perror("open");
		pthread_exit(NULL);
	}

	lseek(fd1, *(int *)len/2, SEEK_SET);
	lseek(fd2, *(int *)len/2, SEEK_SET);
	char buff[100]; 	//存储数据
	int sum = 0; 		//写入计数

	while (1)
	{
		int res = read(fd1, buff, sizeof(buff)); 		//读取数据
		sum += res; 									//计数累加
		if (res == 0 || sum > *(int *)len/2) 				//读取结束或者超过一半
		{
			write(fd2, buff, res - (sum - *(int *)len/2)); 		//写入未超过一半的剩余数据
			printf("1");
			break;
		}
		write(fd2, buff, res);  						//正常写入数据
	}
	close(fd1); 	//关闭文件描述符
	close(fd2);
		pthread_exit(NULL);

}
int main(int argc, const char *argv[])
{
	pthread_t tid1, tid2;  			//定义线程
	int	fd1 = open("./1.txt", O_RDONLY); 	//计算待处理文件长度
	if (fd1 == -1)
	{
		perror("open");
		return -1;
	}
	int len = lseek(fd1, 0, SEEK_END);
	close(fd1);
	if (pthread_create(&tid1, NULL, fun1, &len)) 	//创建子线程1
	{
		perror("pthread_create");
		return -1;
	}
	if (pthread_create(&tid2, NULL, fun2, &len)) 	//创建子线程2
	{
		perror("pthread_create");
		return -1;
	}
	pthread_join(tid1, NULL); 		//回收线程
	pthread_join(tid2, NULL);
	return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…

ERC论文阅读(03)--instructERC论文阅读笔记(2024-12-14)

instructERC论文阅读笔记 2024-12-14 论文题目&#xff1a;InstructERC: Reforming Emotion Recognition in Conversation with Multi-task Retrieval-Augmented Large Language Models 说明&#xff1a;以下内容纯属本人看论文及复现代码的记录&#xff0c;如想了解论文细节&…

《Java核心技术I》Swing用户界面组件

Swing和模型-视图-控制器设计模式 用户界面组件各个组成部分&#xff0c;如按钮&#xff0c;复选框&#xff0c;文本框或复杂的树控件&#xff0c;每个组件都有三个特征&#xff1a; 内容&#xff0c;如按钮的状态&#xff0c;文本域中的文本。外观&#xff0c;颜色&#xff0c…

ubuntu20.04+ROS Noetic 安装PX4+Mavros

文章目录 系统环境安装依赖PX4 安装老版本安装测试环境变量添加版本查看 安装MAVROS&#xff08;二进制安装非源码安装&#xff09;测试 OGC 地面站安装测试mavros与sitl通信参考 系统环境 ubuntu 20.04 ROS Noetic 如果系统安装了Anaconda等虚拟环境管理器&#xff0c;要退出…

IIS服务器部署C# WebApi程序,客户端PUT,DELETE请求无法执行

这两天在自己Windows10电脑上搭建IIS服务器&#xff0c;把自己写的WebApi代码部署上做个本地服务器&#xff0c;结果客户端的PUT和DELETE请求无法执行&#xff0c;GET、POST这些都正常&#xff0c;研究后发现要删除IIS中的“模块”中的"webdavmodule"才能解决。

基于SpringBoot的嗨玩旅游网站:一站式旅游信息服务平台的设计与实现

摘要 在旅游需求日益增长的今天&#xff0c;一个全面、便捷的旅游信息服务平台显得尤为重要。嗨玩旅游网站正是为了满足这一需求而设计的在线平台&#xff0c;它提供了包括景点信息、旅游线路、商品信息、社区信息和活动推广等在内的丰富旅游目的地信息&#xff0c;旨在帮助用…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…

EXCEL的各种图形,统计图形

目录 0 EXCEL的各种图形&#xff0c;统计图形 1 统计图形 / 直方图 / 其实叫 频度图 hist最合适(用原始数据直接作图) 1.1 什么是频度图 1.2 如何创建频度图&#xff0c;一般是只选中1列数据&#xff08;1个数组&#xff09; 1.3 如何修改频度图的宽度 1.4 hist图的一个特…

AI 智能名片 S2B2C 商城小程序在社群团购运营中的作用与价值

摘要&#xff1a;本文深入探讨了 AI 智能名片 S2B2C 商城小程序在社群团购运营中的重要作用。随着社群团购的兴起&#xff0c;如何有效运营成为关键问题。AI 智能名片 S2B2C 商城小程序凭借其独特功能&#xff0c;能够在促进消费者互动、提升产品传播效果、影响购买决策以及实现…

【0x000A】HCI_Reject_Connection_Request命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Reject_Connection_Request命令格式 2.2. 参数说明 2.2.1. BD_ADDR&#xff08;蓝牙设备地址&#xff09; 2.2.2. Reason&#xff08;拒绝原因&#xff09; 三、返回事件及参数说明 3.1. 返回参数 3.2. 生成的事件…

Ant Design of Vue之带select控件,单元格编辑功能的表格EditableCell组件

效果图 功能 表格里面某一行或者某一个单元格支持select复选框可以编辑&#xff0c;新增一行数据&#xff0c;删除一行数据&#xff0c;并且有校验规则 源码 editablecell组件源码 参考自 源码

git企业的使用详细命令行操作

git是Linux创始人通过内核开发而创作的分布式版本的控制系统&#xff0c;而我们作为开发者需要开发与维护&#xff0c;避免不了版本的迭代和更新&#xff0c;git就是用来保存修改删除等操作的工具&#xff0c;可以记录代码改动情况&#xff0c;它能够保存代码的每个版本&#x…

景联文科技提供高质量文本标注服务,驱动AI技术发展

文本标注是指在原始文本数据上添加标签的过程&#xff0c;这些标签可以用来指示特定的实体、关系、事件等信息&#xff0c;以帮助计算机理解和处理这些数据。 文本标注是自然语言处理&#xff08;NLP&#xff09;领域的一个重要环节&#xff0c;它通过为文本的不同部分提供具体…

基于nginx和ffmpeg搭建HTTP FLV流媒体服务器

一、简介 整体是使用nginx搭建HTTP FLV流媒体服务器&#xff1a; 流程&#xff1a;音视频->rtmp->http-flv 音视频转为rtmp需要借助ffmpeg转化。 rtmp转为http-flv需要借助nginx转化。 nginx-http-flv-module是基于nginx-rtmp-module开发的&#xff0c;包含nginx-rt…

01-51单片机硬件基础

开发板介绍 学校授课用的是普中科技的EM3.V2.2开发板&#xff0c;没什么好说的&#xff0c;记着去淘宝上找原理图&#xff0c;别迷信课本。 网上有卖51最小系统板的&#xff0c;比开发板便宜&#xff0c;也有下载模块&#xff0c;可以自己搭建外围电路。 还可以自己在protue…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…

【新人系列】Python 入门(十六):正则表达式

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

资料分析题

1、截位除 差距10% 以内 差距小 否则 差距大 2、基期与现期 3、同比与环比

SpringBoot进阶 - 自定义starter

文章目录 思路封装Starter使用starter 思路 创建模块&#xff0c;封装starter&#xff0c;最后使用starter. 1 - 创建一个Demo Project&#xff0c;模拟一个需要被封装的DemoModule模块&#xff0c;其中核心方法为exeModuleMethod 2 - 通过starter封装可以直接初始化DemoModule…

socket编程UDP-实现停等机制(接收确认、超时重传)

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制&#xff1a; sock…