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函数开始,从上往下执行,称为顺序执行 假设一个程序需要I输入 C计算 P输出,以顺序执行三个上述程序,则其执行过程如下: 程序内部的语句是一条一条的执行,如果要运行多个程序…...
角度回归——角度编码方式
文章目录 1.为什么研究角度的编码方式?1.1 角度本身具有周期性1.2 深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定1.3 那么如何处理边界问题呢:(以θ的边界问题为例&#x…...
【C# Programming】值类型、良构类型
值类型 1、值类型 值类型的变量直接包含值。换言之, 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。 复制引用类型的值时,复制的只是引用。这个引用非常小…...
Linux Day18 TCP_UDP协议及相关知识
一、网络基础概念 1.1 网络 网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、 路由器等设备。 1.2 互联网 把多个网络连接起来就构成了互联网。目前最大的互联网就是因特网。 网络设备有:交换机、路由器、…...
【Java 基础篇】Java网络编程实时数据流处理
在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进…...
Oracle 和 mysql 增加字段SQL
在Oracle和MySQL中,可以使用ALTER TABLE语句来增加字段。下面是分别是两种数据库增加字段的SQL示例: 在Oracle中增加字段的SQL示例: ALTER TABLE 表名ADD (新字段名 数据类型);例如,如果要在名为"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进行数据分析技巧详解
概要 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以࿰…...
BD就业复习第二天
Hbase 1. 架构 HBase(Hadoop Database)是一个开源的分布式、面向列族(Column Family)的NoSQL数据库,它是构建在Hadoop之上的。HBase的架构设计旨在处理大规模的数据,特别适用于需要快速读写和随机访问大量…...
大数据Flink(八十五):Window TVF 支持多维数据分析
文章目录 Window TVF 支持多维数据分析 一、Grouping Sets 二、Rollup...
css-边框原理教程
1. CSS中边框原理 他不是一条直线,根据盒子原理,当边框宽度大于元素的长和宽时,呈现一个梯形和三角形的形状,用如下的代码来实地理解一下边框画法实现的原理 注:学习网址: CSS画几种图形的方法_css画图_老…...
【数据结构】时间、空间复杂度
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 时间、空间复杂度 1. 算法效率3. 时…...
Databend 开源周报第 111 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 理解 SHARE END…...
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程
文章目录 一、环境准备二、基础软件三、扩展:usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子,安装并注册软件(可以百度注册码),最新版本:v17 2、下MacOS系统iOS镜像文件,用于vmware虚拟机安装,当前镜…...
vue3 - Vue 项目处理GitHub Pages 部署后 _plugin-vue_export-helper.js 404
GitHub Demo 地址 在线预览 vue3项目打包后部署到github pages 后,预览网站提示下划线开头的一个文件_plugin-vue_export-helper访问不到,网络请求显示404 处理GitHub Pages 部署 _plugin-vue_export-helper.js 404 https://github.com/rollup/rollup/b…...
一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)
一、目的 当Hive的计算引擎是spark或mr时,发现海豚调度HQL任务的脚本并不同,mr更简洁 二、Hive的计算引擎是Spark时 (一)海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…...
Linux 隔离网段下端口转发
设备在隔离网段下,设置端口转发。使A设备可访问C设备的服务 #!/bin/bash #输出成绩脚本 echo -n "请输入外网服务器的IP地址:" read score sudo iptables -t nat -A PREROUTING -p tcp --dport 1883 -j DNAT --to-destination $score:1883 s…...
【CDN和UDN】CDN和UDN技术特点以及使用场景
内容分发网络(CDN)和用户自定义网络(UDN)是两种不同的网络技术,在选择时,往往不能准备把握具不同的技术特点和应用场景。CDN 主要用于加速内容分发,而 UDN 则主要用于支持用户自定义的网络需求。…...
【Linux】改变缓存路径、清理缓存
写在前面 在做项目的过程中,服务器base路径下空间不足,准备在另一个目录下创建虚拟环境,但在安装的过程中,发现base路径下的空间还是在减少,后来经过学习了解到,pip安装下载依赖包时,会先下载缓…...
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()用来进行颜色模…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
