嵌入式入门Day30

news2024/12/15 13:40:59

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

运行结果

在这里插入图片描述

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

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

相关文章

【Ubuntu】双硬盘安装双系统 Windows 和 Ubuntu

【Ubuntu】双硬盘安装双系统 Windows 和 Ubuntu 1 安装顺序2 Ubutnu 20.042.1 准备工作2.2 自定义分区2.3 遇到的一些问题 1 安装顺序 我选择先在一块 SSD 上安装 Windows 再在另一块 SSD 上安装 Ubuntu&#xff0c;建议先安装 Windows 2 Ubutnu 20.04 2.1 准备工作 制作启…

【Qt】QWidget中的常见属性及其功能(一)

目录 一、 enabled 例子&#xff1a; 二、geometry 例子&#xff1a; window fram 例子 &#xff1a; 四、windowTiltle 五、windowIcon 例子&#xff1a; qrc机制 创建qrc文件 例子&#xff1a; qt中的很多内置类都是继承自QWidget的&#xff0c;因此熟悉QWidget的…

iOS swift开发系列 -- tabbar问题总结

1.单视图如何改为tabbar&#xff0c;以便显示2个标签页 右上角➕&#xff0c;输入tabbar 找到控件&#xff0c;然后选中&#xff0c;把entrypoint移动到tabbar控件 2.改成tabbar&#xff0c;生成两个item&#xff0c;配置各自视图后&#xff0c;启动发现报错 Thread 1: “-[p…

Muduo网络库解析--网络模块(2)

前文 重写Muduo库实现核心模块的Git仓库 注&#xff1a;本文将重点剖析 Muduo 网络库的核心框架&#xff0c;深入探讨作者精妙的代码设计思路&#xff0c;并针对核心代码部分进行重写&#xff0c;将原本依赖 boost 的实现替换为原生的 C11 语法。需要说明的是&#xff0c;本文…

电脑怎么设置通电自动开机(工控机)

操作系统&#xff1a;win10 第一步&#xff0c;电脑开机时按del键进入bios页面。 第二步&#xff0c;选择advanced下的IT8712 Super IO Configuration 第三步&#xff0c;找到Auto Power On&#xff0c;将其从Power off设置为Power On 第四步&#xff0c;F10保存&#xff0c;大…

如何对小型固定翼无人机进行最优的路径跟随控制?

控制架构 文章继续采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#xff1a; { x ˙ p V a cos ⁡ γ cos ⁡ χ V w cos ⁡ γ w cos ⁡ χ w y ˙ p V a cos ⁡ γ sin ⁡ χ V w cos ⁡ γ w sin ⁡ χ…

基于Redis实现令牌桶算法

基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制&#xff08;流量不均匀或变化的衡量标准&#xff09;。它还可以用作调度算…

学习threejs,局部纹理刷新,实现图片分块加载

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…

超标量处理器设计笔记(10) 寄存器重命名过程的恢复、分发

重命名 寄存器重命名过程的恢复使用 Checkpoint 对 RAT 进行恢复使用 WALK 对 RAT 进行恢复使用 Architecture State 对 RAT 进行恢复总结 分发&#xff08;Dispatch&#xff09; 寄存器重命名过程的恢复 当发生异常、分支预测失败时&#xff0c;指令占用 RAT、ROB 和 Issue …

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP&#xff08;推流&#xff09;这几种协议接入&#xff0c;目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入&#xff0c;我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步&#xff1a;萤石摄像机开启 萤石设备默…

Qt编写的文件传输工具

使用QT编写的文件传输工具 文件传输工具通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 文件传输工具 通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 收到的广播消息可以显示在IP地址列表中&#xff0c;点击IP地址可以自动填充到IP地址栏内 选择文件…

【潜意识Java】深入理解 Java 面向对象编程(OOP)

目录 什么是面向对象编程&#xff08;OOP&#xff09;&#xff1f; 1. 封装&#xff08;Encapsulation&#xff09; Java 中的封装 2. 继承&#xff08;Inheritance&#xff09; Java 中的继承 3. 多态&#xff08;Polymorphism&#xff09; Java 中的多态 4. 抽象&…

PWM调节DCDC参数计算原理

1、动态电压频率调整DVFS SOC芯片的核电压、GPU电压、NPU电压、GPU电压等&#xff0c;都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS&#xff08;Dynamic Voltage and Frequency scaling&#xff09;&#xff0c;优化性能和功耗。 比如某SOC在…

OpenCV相关函数

一、二值化函数&#xff08;threshold&#xff09; 功能&#xff1a;将灰度图像转换为二值图像&#xff0c;通常用于图像分割。通过设置阈值&#xff0c;把图像中低于阈值的像素设为0&#xff0c;高于阈值的像素设为1。 参数&#xff1a; src&#xff1a;输入图像。 thresh&a…

bean后处理器的作用

这是beanFactory中常见的一些后处理器&#xff1a; 其中这俩个属于bean后处理器&#xff1a; internalAutowiredAnnotationProcessor解析Autowired、Value internalCommonAnnotationProcessor解析Resource、PostConstruct、PreDestroy Bean后处理器的作用&#xff1a;为Bean…

YOLOv11融合[CVPR2024]Starnet中的star block取模块

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2403.19967 代码链接&#xff1a;https://github.com/ma-xu/Rewri…

日常灵感:听劝是一种天赋

希望这段分享能给你提供一些新的角度&#xff0c;让你在自己的工作和生活中更好地利用这份“听劝”的天赋&#xff01; 父与子的救赎&#xff1a;听劝的天赋 学霸爸爸李先生是一个典型的"别人家的父母"。 他从小就是学霸&#xff0c;凭借过硬的学习能力从重点高中一…

The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论

讨论 论法学硕士研究与Agent研究的互利性 近年来&#xff0c;随着激光诱导金属化技术的发展&#xff0c;激光诱导金属化与化学剂交叉领域的研究取得了长足的进步&#xff0c;促进了这两个领域的发展。在此&#xff0c;我们期待着LLM研究和Agent研究相互提供的一些益处和发展机…

React 第十六节 useCallback 使用详解注意事项

useCallback 概述 1、useCallback 是在React 中多次渲染缓存函数的 Hook&#xff0c;返回一个函数的 memoized的值&#xff1b; 2、如果多次传入的依赖项不变&#xff0c;那么多次定义的时候&#xff0c;返回的值是相同的,防止频繁触发更新&#xff1b; 3、多应用在 父组件为函…

Transformer: Attention Is All You Need (2017) 翻译

论文&#xff1a;Attention Is All You Need 下载地址如下: download: Transformer Attention Is All you need Attention Is All You Need 中文 《Attention Is All You Need》是《Transformer》模型的开创性论文&#xff0c;提出了一种全新的基于注意力机制的架构&#xf…