当前位置: 首页 > news >正文

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

并发

前面编写的程序都是从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

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

NAMEpthread_create - create a new threadSYNOPSIS#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函数,并且传递的参数为NULLif (0 != ret){printf("pthread1 create error:%d\n",ret );}ret = pthread_create(&tid2, NULL,thread_function2, NULL);//创建一个线程去执行thread_function1函数,并且传递的参数为NULLif (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.小游戏

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

在这里插入图片描述

相关文章:

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

并发 前面编写的程序都是从mian函数开始&#xff0c;从上往下执行&#xff0c;称为顺序执行 假设一个程序需要I输入 C计算 P输出&#xff0c;以顺序执行三个上述程序&#xff0c;则其执行过程如下&#xff1a; 程序内部的语句是一条一条的执行&#xff0c;如果要运行多个程序…...

角度回归——角度编码方式

文章目录 1.为什么研究角度的编码方式&#xff1f;1.1 角度本身具有周期性1.2 深度学习的损失函数因为角度本身的周期性&#xff0c;在周期性的点上可能产生很大的Loss&#xff0c;造成训练不稳定1.3 那么如何处理边界问题呢&#xff1a;&#xff08;以θ的边界问题为例&#x…...

【C# Programming】值类型、良构类型

值类型 1、值类型 值类型的变量直接包含值。换言之&#xff0c; 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用&#xff08;通常为内存地址)。 复制引用类型的值时&#xff0c;复制的只是引用。这个引用非常小&#xf…...

Linux Day18 TCP_UDP协议及相关知识

一、网络基础概念 1.1 网络 网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 1.2 互联网 把多个网络连接起来就构成了互联网。目前最大的互联网就是因特网。 网络设备有&#xff1a;交换机、路由器、…...

【Java 基础篇】Java网络编程实时数据流处理

在现代计算机应用程序中&#xff0c;处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据&#xff0c;需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库&#xff0c;可以用于处理实时数据流。本文将详细介绍如何使用Java进…...

Oracle 和 mysql 增加字段SQL

在Oracle和MySQL中&#xff0c;可以使用ALTER TABLE语句来增加字段。下面是分别是两种数据库增加字段的SQL示例&#xff1a; 在Oracle中增加字段的SQL示例&#xff1a; ALTER TABLE 表名ADD (新字段名 数据类型);例如&#xff0c;如果要在名为"employees"的表中添加…...

【脚本】 【Linux】循环执行命令

loop.sh #!/bin/bashif [ "" "$1" ]; thenecho 用法: ./loop.sh 命令内容 时间间隔(毫秒) 循环次数(小于0表示无限循环)echo 示例: ./loop.sh "ps -ef" 1000 10exit 0 fiinterval1000 if [ "" ! "$2" ]; thenif echo &quo…...

快速用Python进行数据分析技巧详解

概要 一些小提示和小技巧可能是非常有用的&#xff0c;特别是在编程领域。有时候使用一点点黑客技术&#xff0c;既可以节省时间&#xff0c;还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物&#xff0c;并且可以成为真正的生产力助推器。所以&#xff0…...

BD就业复习第二天

Hbase 1. 架构 HBase&#xff08;Hadoop Database&#xff09;是一个开源的分布式、面向列族&#xff08;Column Family&#xff09;的NoSQL数据库&#xff0c;它是构建在Hadoop之上的。HBase的架构设计旨在处理大规模的数据&#xff0c;特别适用于需要快速读写和随机访问大量…...

大数据Flink(八十五):Window TVF 支持多维数据分析

文章目录 Window TVF 支持多维数据分析 一、Grouping Sets 二、​​​​​​​Rollup...

css-边框原理教程

1. CSS中边框原理 他不是一条直线&#xff0c;根据盒子原理&#xff0c;当边框宽度大于元素的长和宽时&#xff0c;呈现一个梯形和三角形的形状&#xff0c;用如下的代码来实地理解一下边框画法实现的原理 注&#xff1a;学习网址&#xff1a; CSS画几种图形的方法_css画图_老…...

【数据结构】时间、空间复杂度

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 时间、空间复杂度 1. 算法效率3. 时…...

Databend 开源周报第 111 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解 SHARE END…...

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录 一、环境准备二、基础软件三、扩展&#xff1a;usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子&#xff0c;安装并注册软件(可以百度注册码)&#xff0c;最新版本&#xff1a;v17 2、下MacOS系统iOS镜像文件&#xff0c;用于vmware虚拟机安装&#xff0c;当前镜…...

vue3 - Vue 项目处理GitHub Pages 部署后 _plugin-vue_export-helper.js 404

GitHub Demo 地址 在线预览 vue3项目打包后部署到github pages 后&#xff0c;预览网站提示下划线开头的一个文件_plugin-vue_export-helper访问不到&#xff0c;网络请求显示404 处理GitHub Pages 部署 _plugin-vue_export-helper.js 404 https://github.com/rollup/rollup/b…...

一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)

一、目的 当Hive的计算引擎是spark或mr时&#xff0c;发现海豚调度HQL任务的脚本并不同&#xff0c;mr更简洁 二、Hive的计算引擎是Spark时 &#xff08;一&#xff09;海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…...

Linux 隔离网段下端口转发

设备在隔离网段下&#xff0c;设置端口转发。使A设备可访问C设备的服务 #!/bin/bash #输出成绩脚本 echo -n "请输入外网服务器的IP地址&#xff1a;" read score sudo iptables -t nat -A PREROUTING -p tcp --dport 1883 -j DNAT --to-destination $score:1883 s…...

【CDN和UDN】CDN和UDN技术特点以及使用场景

内容分发网络&#xff08;CDN&#xff09;和用户自定义网络&#xff08;UDN&#xff09;是两种不同的网络技术&#xff0c;在选择时&#xff0c;往往不能准备把握具不同的技术特点和应用场景。CDN 主要用于加速内容分发&#xff0c;而 UDN 则主要用于支持用户自定义的网络需求。…...

【Linux】改变缓存路径、清理缓存

写在前面 在做项目的过程中&#xff0c;服务器base路径下空间不足&#xff0c;准备在另一个目录下创建虚拟环境&#xff0c;但在安装的过程中&#xff0c;发现base路径下的空间还是在减少&#xff0c;后来经过学习了解到&#xff0c;pip安装下载依赖包时&#xff0c;会先下载缓…...

python+opencv寻找图片或视频中颜色进行追踪之HSV颜色处理

pythonopencv寻找图片或视频中颜色进行追踪之HSV颜色处理 1.颜色空间转换 import cv2img cv2.imread(1.jpg) # 转换为灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(img, img) cv2.imshow(gray, img_gray) cv2.waitKey(0)cv2.cvtColor()用来进行颜色模…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...