8.gec6818开发板通过并发多线程实现电子相册 智能家居 小游戏三合一完整项目

2023-09-20 16:46:43

并发

前面编写的程序都是从mian函数开始,从上往下执行,称为顺序执行

假设一个程序需要I输入 C计算 P输出,以顺序执行三个上述程序,则其执行过程如下:

在这里插入图片描述

程序内部的语句是一条一条的执行,如果要运行多个程序,这些程序也是一个一个的依次执行,若上述的三种操作,每种操作需要的时间都是t,则执行上述三个程序共需要9t

而在上述程序的执行过程中,只有计算需要用到cpu==》CPU的利用率只有 3t/9t = 33.33%

顺序执行的CPU利用率太低

有没有办法提高CPU利用率呢?

==》并发

1.并发执行

并发 指的是同一时间内,同时处理多个任务的机制

我们现在的操作系统几乎都支持并发执行,并且提供并发的实现机制==》Linux并发进程和并发线程

所谓并发是指多个任务在“同一时间”被处理==》“同一时间”:指的是一段时间而不是某个时间点

(同一时间点有多个任务同时被处理,称之为并行,多核cpu的实现)

并发执行的实现是将一个任务按其功能分为多个阶段,并且不同的阶段有不同的组件去完成,因此当一个任务在执行其中的某个功能的时候,其他组件可以去执行另外的已经就绪的功能

在这里插入图片描述

原本需要9t才能完成的任务,此时只需要5t,意味着CPU的利用率达到了3T/5T=60%有效的提高了CPU的利用率

2.Linux线程并发的实现

线程是指在一个程序执行过程中开辟多条执行分支去同时处理不同的任务的一种机制

“执行分支”就是所谓的线程

在这里插入图片描述

程序在运行时,从mian函数开始执行的分支称为主线程,主线程是程序程序执行的伊始,同时一旦主线程执行结束,整个程序也就结束了,不管其他的分支线程是否执行完成,都会随着主线程一起结束

如何在程序执行过程中,创建新的执行分支线程呢

创建线程

Linux中的线程是采用POSIX提供的接口来创建和维护,因此需要引用头文件pthread.h ,同时在编译时需要链接POSIX库

即我们编译时要加上-pthread

创建线程是通过调用下列函数来实现

NAME
       pthread_create - create a new thread

SYNOPSIS
       #include <pthread.h>
			pthread_create用来创建一个新的线程
       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
		@thread:指针指向一个pthread_t类型的变量,用来存储线程的编号(线程号)
        @attr:指定线程属性,一般为NULL
        @start_routine:函数指针,指向一个返回值为void*,参数为void*的函数,是用来指定新创建的线程需要执行的函数
        @arg:void*指针,指向用于传递给线程函数的参数
        返回值:成功是0
               失败返回一个!0值,是函数调用失败的错误编码
       Compile and link with -pthread.

注意:如果在一个程序执行过程中创建了线程,则主线程和分支线程是“同时”执行的

例如:

在一个程序中,创建两个执行分支,其中

1.主分支不断输出’hello"

2.1号分支不断输出"nihao"

3.2号分支不断输出一个"gun"

顺序执行的结果

在这里插入图片描述

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>


void* thread_function1(void*arg)
{
	while(1)
	{
		printf("nihao\n");
		sleep(1);
	}
}

void* thread_function2(void*arg)
{
	while(1)
	{
		printf("gun\n");
		sleep(1);
	}
} 

int main (void)
{
	thread_function1(NULL);
	thread_function2(NULL);

	while(1)
	{
		printf("hello\n");
		sleep(1);
	}

}

通过线程方式实现

在这里插入图片描述

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>


void* thread_function1(void*arg)
{
	while(1)
	{
		printf("nihao\n");
		sleep(1);
	}
}

void* thread_function2(void*arg)
{
	while(1)
	{
		printf("gun\n");
		sleep(1);
	}
} 

int main (void)
{
	//thread_function1(NULL);
	//thread_function2(NULL);
	pthread_t tid1,tid2;
	int ret = 0;
	ret = pthread_create(&tid1, NULL,thread_function1, NULL);//创建一个线程去执行thread_function1函数,并且传递的参数为NULL
	if (0 != ret)
	{
		printf("pthread1 create error:%d\n",ret );
	}
	
	ret = pthread_create(&tid2, NULL,thread_function2, NULL);//创建一个线程去执行thread_function1函数,并且传递的参数为NULL
	if (0 != ret)
	{
		printf("pthread1 create error:%d\n",ret );
	}


	while(1)
	{
		printf("hello\n");
		sleep(1);
	}

}

上述案例中创建了两个分支线程+主线程 总共有三个线程在同时执行,因此可以同时处理三个死循环的任务

并且:虽然三个线程执行的是不同的代码,但是都处于一个程序中,他们可以访问相同的全局变量

任务:

在项目中创建多个线程,让不同的线程去完成不同的工作,并且与你设计的初始界面的按键相匹配

1.电子相册

2.GY-39数据的采集,并将数据保存在全局变量中

3.高温报警器

4.将全局变量中的数据显示到LCD屏幕中

5.小游戏

主线程负责获取触摸屏的输入事件来实现人机交互

个线程执行的是不同的代码,但是都处于一个程序中,他们可以访问相同的全局变量

任务:(电子相册 智能家居 小游戏三合一项目 需要私信我)

在项目中创建多个线程,让不同的线程去完成不同的工作,并且与你设计的初始界面的按键相匹配

1.电子相册

2.GY-39数据的采集,并将数据保存在全局变量中

3.高温报警器

4.将全局变量中的数据显示到LCD屏幕中

5.小游戏

主线程负责获取触摸屏的输入事件来实现人机交互

在这里插入图片描述

更多推荐

2023中国智能产业高峰论坛丨文档图像大模型的思考与探索

#前言随着人工智能技术的不断发展,尤其是深度学习技术的广泛应用,多模态数据处理和大模型训练已成为当下研究的热点之一,这些技术也为文档图像智能处理和分析领域带来了新的发展机遇。近期,2023第十二届中国智能产业高峰论坛(CIIS2023)在江西南昌开幕,政企研学各界学者专家同台交流,在成果分享、观点碰撞、经验互鉴中,共促

pytest一些常见的插件

Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“pytest-*”为标识。本篇将列举github标星超过两百的一些插件进行实战演示。插件库地址:http://plugincompat.herokuapp.com/1、pytest-html:用于生成HTML报告一次完整的测试,

GRACE球谐数据滤波处理(利用matlab实现GRACE月水储量的二维傅里叶变化滤波)

GRACE的全球重力场产品以球谐系数(SHCs)的形式表现出明显的南北条带噪声问题,这种噪声被认为来源于它的极轨道、缺乏横向敏感性以及采样频率引起的混叠效应。空间滤波器的例子包括各向同性高斯滤波器(Wahretal.,1998)及其非各向同性变体(Hanetal.,2005;Zhangetal.,2009),维纳滤波器

Springboot 集成WebSocket作为客户端,含重连接功能,开箱即用

使用演示publicstaticvoidmain(String[]args)throwsException{//初始化socket客户端BaseWebSocketClientsocketClient=BaseWebSocketClient.init("传入链接");//发送消息socketClient.sendMess

电磁散射模拟的体积积分方程求解器:使用MATLAB中的ceviche_challenges模块进行光子器件逆向设计详解

第一部分:电磁散射模拟与体积积分方程求解器简介在现代光子学领域,电磁散射模拟是一个核心技术,它涉及到光子器件的设计、分析和优化。为了准确地模拟电磁波在复杂介质中的传播,研究者们开发了多种数值方法。其中,体积积分方程求解器是一个强大的工具,它可以为复杂的光子器件提供精确的模拟结果。MATLAB,作为一个广泛使用的数值计算

讯飞星火认知大模型Java后端接口

文章目录1.免费申请星火大模型套餐2.Java后端接口说明2.1项目地址2.2项目说明2.3项目结构2.4项目代码🍀maven依赖🍀application.yml配置文件🍀config包📌XfXhConfig🍀dto包📌MsgDTO📌RequestDTO📌ResponseDTO🍀listener包📌

详细介绍下路由器的LAN接口

路由器的LAN口(LocalAreaNetworkport)是指用于连接局域网(LAN)设备的接口。它提供了有线连接的接口,允许局域网内的设备通过以太网线连接到路由器,并与其他局域网设备进行通信。以下是对路由器的LAN口的详细介绍:功能:LAN口的主要功能是提供有线网络连接,用于连接局域网内的设备,如台式电脑、网络打印

探索状态驱动开发的奇妙世界——Cola-StateMachine的介绍与使用

文章目录1.前言2.Cola-StateMachine概述3.Cola-StateMachine相关API4.Cola-StateMachine实战5.其他1.前言前面接受了Spring实现的状态机SpringStateMachine,这个状态机的优点在于功能很完备,缺点也是功能十分完备。完备到什么程度了,提供了状态机

ICS TRIPLEX T8310 自动化控制模块

ICSTRIPLEXT8310是一种自动化控制模块,通常用于工业控制和自动化系统中,以实现对各种过程和设备的自动控制。以下是可能包括在ICSTRIPLEXT8310自动化控制模块中的一些常见产品功能:PLC(可编程逻辑控制器)功能:T8310模块通常具备PLC功能,可编程逻辑控制,以实现自动化控制逻辑和任务。多通道输入

C#webform Static DataTable 多人同时操作网页数据重复问题

在C#WebForms中,如果声明一个static变量,它将在整个应用程序域(ApplicationDomain)中保持持久化状态。每个用户的请求都在同一个应用程序域中处理,因此static变量在不同页面间保持相同的值。当一个用户发起请求时,Web服务器会创建一个新的线程来处理该请求,但它仍然在同一个应用程序域中运行。

C#通过重写Panel改变边框颜色与宽度的方法

在C#中,Panel控件是一个容器控件,用于在窗体或用户控件中创建一个可用于容纳其他控件的面板。Panel提供了一种将相关控件组合在一起并进行布局的方式。以下是Panel控件的详细使用方法:在窗体上放置Panel控件:在VisualStudio的窗体设计器中,从工具箱中拖动并放置一个Panel控件到你的窗体上。添加其他

热文推荐