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

线程:

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java EE初阶二十五】简单的表白墙(一)

1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

vue2中的render函数和vue3中的区别

一、vue2中关于render的地址如下&#xff1a; 官网关于render描述的链接 源码如下&#xff1a; render?(this: undefined, createElement: CreateElement, context: RenderContext<Props>): VNode | VNode[];解释&#xff1a; vue2中第一个参数是h&#xff08;其实就是…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

【Flutter/Android】新建项目,打开android 目录,报错红色以及开启 MultiDex 配置

1 报错红色问题。 单独打开 Flutter 项目下的 android 项目即可。 也就是说&#xff0c;你要一部分原生代码开发&#xff0c;你就需要自己把 android 项目单独出去做&#xff08;其实就相当于android 项目引用 Flutter的dart部分&#xff09;。也就是说&#xff0c;在 Flutter…

时间序列分析实战(六):ARIMA乘法(疏系数)模型建模及预测

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

紫外-可见吸收光谱法(UV-Vis)是最常用吸收光谱技术 市场持续扩大

紫外-可见吸收光谱法&#xff08;UV-Vis&#xff09;是最常用吸收光谱技术 市场持续扩大 紫外-可见吸收光谱法&#xff0c;也称为紫外-可见分光光度法&#xff0c;简称UV-Vis&#xff0c;利用样品分子在紫外和可见光激发下产生电子能级跃迁形成的吸收光谱&#xff0c;对元素进行…

【lv14 day10内核模块参数传递和依赖】

一、模块传参 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type&#xff1a; 使用符号 实际类型 传参方式 bool bool insmod xxx.ko 变量名0 或 1 invbool bool insmod xxx.ko 变量名0 或 1 charp char * insmod xxx.ko 变量名“字符串…

Sora - 真正单兵作战时代来临了

一、 OpenAI Sora 视频生成模型技术报告总结 不管是在视频的保真度、长度、稳定性、一致性、分辨率、文字理解等方面&#xff0c;Sora都做到了SOTA&#xff08;当前最优&#xff09;。 技术细节写得比较泛&#xff08;防止别人模仿&#xff09;大概就是用视觉块编码&#xff08…

Java数据结构----时间和空间复杂度

目录 1.算法效率 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 推导大O阶方法 3.4 常见时间复杂度计算举例 3.空间复杂度 1.算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xf…

Linux-基础命令(黑马学习笔记)

Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树形结构 Windows系统可以拥有多个盘符&#xff0c;如C盘、D盘、E盘 Linux没有盘符这个概念&#xff0c;只有一个根目录 /&#xff0c;所有文件都在它下面 Linux路径的描述方式 ● 在Linux系统中&#xff0c;路径之…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

元学习(meta-learning)的通俗解释

目录 1、什么是元学习 2、元学习还可以做什么 3、元学习是如何训练的 1、什么是元学习 meta-learning 的一个很经典的英文解释是 learn to learn&#xff0c;即学会学习。元学习是一个很宽泛的概念&#xff0c;可以有很多实现的方式&#xff0c;下面以目标检测的例子来解释…