嵌入式学习第二十一天!(线程)

线程:

  1. 基本概念:

      线程:线程是一个轻量级的进程,位于进程空间内部,一个进程中可以创建多个线程

  2. 线程创建:

      线程独占栈空间,文本段、数据段和堆区与进程共享

  3. 线程调度:

      与进程调度是一样的:宏观并行,微观串行

  4. 线程消亡:

      与进程消亡是一样的

  5. 进程和线程的区:

      进程是操作系统资源分配的最小单元

      线程是CPU任务调度的最小单元

  6. 多进程和多线程的优缺点:

      1. 效率:多线程 优于 多进程

         原因:多线程只需在同一进程空间内切换;多进程需要在不同的空间中切换

      2. 通信:多线程 优于 多进程

         原因:线程共享全局变量,可以通过全局变量实现数据通信;进程空间是独立的,没有共享空间,通信实现比较复杂

      3. 通信实现:多进程 优于 多线程

         原因:线程共享空间操作时会引发资源竞争;进程没有共享空间,不存在资源竞争的问题

      4. 安全:多进程 优于 多线程

         原因:一个进程异常不会影响其余进程空间;一个线程异常结束会导致进程异常结束,进程异常结束,该进程内所有线程任务均无法向下执行

  7. 线程相关的函数接口:

      创建:fork(进程)      pthread_create(线程)

      退出:exit(进程)      pthread_exit(线程)

      回收:wait(进程)      pthread_join(线程)

      1. pthread_create:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

         功能:在该进程中创建一个新的线程

         参数:

            thread:存放线程ID空间首地址
            attr:线程属性空间首地址
            start_routine:线程要执行的函数的入口
            arg:给线程函数的参数

          返回值:

             成功返回0 
             失败返回错误码

      2.pthread_self:

pthread_t pthread_self(void);

         功能:获得调用该函数线程的ID

      练习:

            1. 创建三个线程任务,并打印线程tid

#include "head.h"

void *thread1(void *arg)
{
	printf("start to thread1:%#x\n", (unsigned int)pthread_self());
	return NULL;
}	
void *thread2(void *arg)
{
	printf("start to thread2:%#x\n", (unsigned int)pthread_self());
	return NULL;
}	
void *thread3(void *arg)
{
	printf("start to thread3:%#x\n", (unsigned int)pthread_self());
	return NULL;
}	

int main(void)
{
	pthread_t tid[3];
	int ret = 0;
	int i = 0;
	void *(*p[3])(void *) = {thread1, thread2, thread3};

	for(i = 0; i < 3; i++)
	{
		ret = pthread_create(&tid[i], NULL, p[i], NULL);
		if(ret != 0)
		{
			perror("fail to pthread_create");
			return -1;
		}
	}

	while(1)
	{

	}

	return 0;
}

      3. pthread_exit:

void pthread_exit(void *retval);

         功能:让调用该函数的线程任务结束

         参数:

            retval:线程结束的值

      4. pthread_join:

int pthread_join(pthread_t thread, void **retval);

         功能:回收线程空间

         参数:

            thread:线程的ID号
            retval:存放线程结束状态空间的首地址

         返回值:

            成功返回0 
            失败返回错误码

  作业:

        1. 创建4个线程任务,任务一循环间隔1s打印"采集线程正在执行"
                 任务二循环间隔2s打印"存储线程正在执行"
                 任务三循环间隔5s打印"告警线程正在执行"
                 任务四循环间隔10s打印"日志线程正在执行"

#include "head.h"

void *thread1(void *parg)
{
	while(1)
	{
		sleep(1);
		printf("采集线程正在执行任务\n");
	}
	pthread_exit(NULL);
}
void *thread2(void *parg)
{
	while(1)
	{
	sleep(2);
	printf("存储线程正在执行\n");
	}
	pthread_exit(NULL);
}
void *thread3(void *parg)
{
	while(1)
	{
		sleep(5);
		printf("告警线程正在执行\n");
	}
	pthread_exit(NULL);
}
void *thread4(void *parg)
{
	while(1)	
	{
		sleep(10);
		printf("日志线程正在执行\n");
	}
	pthread_exit(NULL);
}
int main(void)
{
	pthread_t pid[4];
	
	pthread_create(&pid[0], NULL, thread1, NULL);
	pthread_create(&pid[1], NULL, thread2, NULL);
	pthread_create(&pid[2], NULL, thread3, NULL);
	pthread_create(&pid[3], NULL, thread4, NULL);
	
	for(int i = 0; i < 4; i++)
	{
		pthread_join(pid[i], NULL);
	}

	return 0;
}

        2. 1031 查验身份证 - PAT (Basic Level) Practice (中文) (pintia.cn)

#include <stdio.h>
#include <string.h>

struct people
{
	char number[19];
};

int IntputPeople(struct people *ppnum, int maxlen)
{
	int i = 0;
	int n = 0;
	
	scanf("%d", &n);
	if(n > maxlen)
	{
		perror("over the limit");
		return -1;
	}

	for(i = 0; i < n; i++)
	{
		scanf("%s", ppnum[i].number);
	}	

	return n;

}

int CheckNumber(char *ppnum)
{
	int i = 0;
		
	while(ppnum[i] != '\0' && i < 17)
	{
		if(ppnum[i] == 'X')
		{
			return 0;
		}
		i++;
	}
	return 1;
}

int main(void)
{	
	int i = 0;
	int j = 0;
	int n = 0;
	int sum = 0;
	int ret = 0;
	int checkbit = 0;

	struct people pnum[1000];
	int weight[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
	char M[12] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

	n = IntputPeople(pnum, 1000);

	for(i = 0; i < n; i++)
	{
		if(CheckNumber(pnum[i].number))
		{
			sum = 0;
			for(j = 0; j < 17; j++)
			{
				sum += weight[j] * (pnum[i].number[j] - '0');
			}
			checkbit = sum % 11;
			if(pnum[i].number[17] == M[checkbit])
			{
				ret++;
			}
			else
			{
				printf("%s\n", pnum[i].number);
			}
		}
		else
		{
			printf("%s\n", pnum[i].number);
		}
	}
	if(ret == n)
	{
		printf("All passed\n");
	}

	return 0;

}

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

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

相关文章

Tomcat 下部署若依单体应用可观测最佳实践

实现目标 采集指标信息采集链路信息采集日志信息采集 RUM 信息会话重放 即用户访问前端的一系列过程的会话录制信息&#xff0c;包括点击某个按钮、操作界面、停留时间等&#xff0c;有助于客户真是意图、操作复现 版本信息 Tomcat (9.0.81)Springboot(2.6.2)JDK (>8)DDT…

2024年软件测试路线,不同等级应具备的基本能力(总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的正确…

大数据可视化的设计规范,全面剖析,很实用。

大数据可视化的设计规范需要考虑到数据量大、复杂度高、数据类型多样等特点。以下是一份常见的大数据可视化设计规范&#xff0c;供您参考&#xff1a; 设计原则 简单易用&#xff1a;保证用户操作简单、直观&#xff0c;降低用户认知负担。数据准确&#xff1a;保证数据准确…

数据可视化引领智慧工业新时代

在智慧工业的大潮中&#xff0c;数据可视化崭露头角&#xff0c;以其直观、清晰的方式赋能工业生产&#xff0c;为智慧工业的高效运转提供了强有力的支持。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 数据可视化首先在智慧工业的生产监控中大显身手。通过将…

4-Bean的循环依赖

Bean的循环依赖 循环依赖指的是依赖闭环的问题 解决 首先我们来实例化A&#xff0c;实例化A时并没有处理依赖注入&#xff0c;因此会得到半成品A。有了半成品A&#xff0c;它会被封装成一个ObjectFactory&#xff0c;并且把它放入第三个缓存区singletonFactories中。 接下来要…

tmux的使用方法

1. tmux的定义 我&#xff1a;什么是tmux&#xff1f; GPT&#xff1a;tmux&#xff08;terminal multiplexer&#xff09;是一个强大的终端复用器&#xff0c;它允许用户在一个终端窗口中创建、访问和控制多个会话。使用tmux&#xff0c;你可以在一个窗口中打开多个终端会话&…

苍穹外卖 -- day11 - Apache ECharts- 营业额统计- 用户统计- 订单统计- 销量排名Top10

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#x…

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示&#xff1a; 表示docker正在运行中

【Vue】

什么是Vue Vue是一款用于构建用户界面的JavaScript框架&#xff0c;它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助开发者高效地开发用户界面。Vue是一个JS库&#xff0c;无依赖其他JS库&#xff0c;直接引入一个JS文…

数据可视化--了解数据可视化和Excel数据可视化

目录 1.1科学可视化&#xff1a; 可视化是模式、关系、异常 1.2三基色原理&#xff1a; 三基色:红色、绿色和蓝色 1.3Excel数据可视化 1.3.1 excel数据分析-13个图表可视化技巧 1.3.2 excel数据分析-28个常用可视化图表&#xff08;video&#xff09; 1.3.3Excel可视化…

适配器模式(Adapter Pattern) C++

上一节&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09; C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允…

基于JAVA的就医保险管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

B站项目-基于Pytorch的ResNet垃圾图片分类

基于Pytorch的ResNet垃圾图片分类 数据集预处理 画图片的宽高分布散点图 import osimport matplotlib.pyplot as plt import PIL.Image as Imagedef plot_resolution(dataset_root_path):image_size_list []#存放图片尺寸for root, dirs, files in os.walk(dataset_root_pa…

提升Vue3应用效率的秘诀:深入比较ref与reactive!

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

【深度学习】Pytorch教程(十三):PyTorch数据结构:5、张量的梯度计算:变量(Variable)、自动微分、计算图及其可视化

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

Netty NIO 非阻塞模式

1.概要 1.1 说明 使用非阻塞的模式&#xff0c;就可以用一个现场&#xff0c;处理多个客户端的请求了 1.2 要点 ssc.configureBlocking(false);if(sc!null){ sc.configureBlocking(false); channels.add(sc); }if(len>0){ byteBuffer.flip(); 2.代码 2.1 服务端代码 …

mini-spring|定义标记类型Aware接口,实现感知容器对象

**前言&#xff1a;**如果我们想获得 Spring 框架提供的 BeanFactory、ApplicationContext、BeanClassLoader等这些能力做一些扩展框架的使用时该怎么操作呢。所以我们本章节希望在 Spring 框架中提供一种能感知容器操作的接口&#xff0c;如果谁实现了这样的一个接口&#xff…

智慧城市与数字孪生:共创未来城市新篇章

一、引言 随着科技的飞速发展&#xff0c;智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接&#xff0c;为城市管理、规划…

docker容器技术(2)

docker容器数据卷 什么是数据卷&#xff1f; 在Docker中&#xff0c;数据卷&#xff08;Data Volumes&#xff09;是一种特殊的目录&#xff0c;可以在容器和主机之间共享数据。它允许容器内的文件持久存在&#xff0c;并且可以被多个容器共享和访问。 数据卷的主要作用如下&am…

jdk21本地执行flink出现不兼容问题

环境说明&#xff1a;换电脑尝尝鲜&#xff0c;jdk&#xff0c;flink都是最新的&#xff0c;千辛万苦把之前的项目编译通过&#xff0c;跑一下之前的flink项目发现启动失败&#xff0c;啥都不说了上异常 Exception in thread "main" java.lang.IllegalAccessError: …