学习嵌入式第三十天

文章目录

  • 进程和线程(续)
    • 线程
      • 1.线程传参
      • 2.线程属性
      • 3.线程间通信
        • 1.概念
        • 2.方式
        • 3.互斥锁
        • 4.死锁
        • 5.信号量
  • 习题

进程和线程(续)

线程

1.线程传参

  • 使用第四个参数实现对线程内部的传参

    代码实现:

    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <pthread.h>
    #include <unistd.h>typedef struct pthread_arg{pthread_t tid;char threadname[32];int sleeptime;
    }pthread_arg_t;void *thread(void *arg){pthread_arg_t *parg = arg;printf("%s(TID:%#lx)开始执行\n",parg->threadname,parg->tid);while(1){printf("%s正在执行\n",parg->threadname);sleep(parg->sleeptime);}return NULL;
    }int main(void){int i = 0;pthread_arg_t args[4] = {{0,"采集线程", 1},{0, "存储线程", 2},{0, "显示线程", 5},{0, "日志线程", 10}};for(i = 0;i < 4;i++){pthread_create(&args[i].tid,NULL,thread,&args[i]);}for(i = 0;i < 4;i++){pthread_join(args[i].tid,NULL);}return 0;
    }
    

2.线程属性

  • 加入属性:线程结束需要pthread_join手动回收,但是可以完成线程间同步
  • 分离属性:线程结束后系统自动回收线程空间
  1. pthread_attr_init

    原型:int pthread_attr_init(pthread_attr_t *attr);
    功能:线程属性初始化
    参数:attr:线程属性空间的首地址
    
  2. pthread_attr_setdetachstate

    原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    功能:将线程属性设置为分离属性
    参数:attr:线程属性空间的首地址detachstate:属性PTHREAD_CREATE_DETACHED	分离属性PTHREAD_CREATE_JOINABLE	加入属性
    
  3. pthread_attr_destroy

    原型:int pthread_attr_destroy(pthread_attr_t *attr);
    功能:线程属性销毁
    参数:attr:线程属性空间的首地址
    

3.线程间通信

1.概念
  • 多个线程间传递信息
2.方式

采用全局变量

  • 原因:进程是操作系统分配的最小单元;每个进程空间独立,包含文本段,数据段(全局变量),系统数据段;一个进程中的多个线程独享栈空间,而文本段,数据段,堆区进程多线程共享
  • 多线程同时操作共享空间会引发资源竞争,需要加上互斥锁解决资源竞争问题
3.互斥锁
  1. 概念

    • 解决资源竞争的一种方式,可以看成是一种资源

    • 只能加锁一次,加锁期间不能再次加锁,也不能强制占有一个已经加锁的锁资源,必须等待锁资源释放,也就是解锁后才能继续操作该锁

    • 加锁和解锁中间的代码称为临界代码,也称为临界区

    • 只能防止多个线程对资源的竞争,不能决定代码的先后执行顺序

    • 原子操作:CPU执行原子操作时无法切换调度任务

  2. 使用方式

    • 定义互斥锁
    • 对锁初始化
    • 操作全局资源前先加锁
    • 如果加锁成功则完成对全局资源操作
    • 如果加锁失败则表示有人占用资源,必须等待其余人释放锁资源才能加锁成功
    • 直到加锁成功使用该全局资源
  3. 函数接口

    1. pthread_mutex_init

      原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
      功能:初始化互斥锁
      参数:mutex:互斥锁空间首地址attr:属性,默认为NULL
      返回值:成功返回0失败返回-1
      
    2. pthread_mutex_lock

      原型:int pthread_mutex_lock(pthread_mutex_t *mutex);
      功能:互斥锁加
      
    3. pthread_mutex_unlock

      原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);
      功能:互斥锁解
      
    4. pthread_mutex_destroy

      原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);
      功能:互斥锁销毁
      
4.死锁
  1. 概念
    • 多线程由于加锁解锁不合理导致程序无法继续向下运行的状态
  2. 产生的条件
    • 互斥条件
    • 不可剥夺条件
    • 请求保持条件
    • 循环等待条件
  3. 避免死锁
    • 加锁顺序保持一致
    • 使用pthread_mutex_trylock替换pthread_mutex_lock
5.信号量
  1. 概念

    • 信号量是一种资源
    • 信号量只能完成初始化,销毁,申请,释放四种操作
    • 如果信号量资源数为0,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为0时才能申请到资源并继续向下执行
    • 释放资源不会阻塞
  2. 函数接口

    1. sem_init

      原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
      功能:初始化信号量
      参数:sem:信号空间首地址pshared:0:一个进程的多个线程间共享!0:多个进程间共享value:初始化的资源的值	
      返回值:成功返回0失败返回-1
      
    2. sem_destroy

      原型:int sem_destroy(sem_t *sem);
      功能:销毁信号量
      参数:sem:信号量空间的首地址
      返回值:成功返回0失败返回-1
      
    3. sem_wait

      原型:int sem_wait(sem_t *sem);
      功能:申请信号量
      参数:sem:信号量空间的首地址
      返回值:成功返回0失败返回-1
      
      • 申请信号量会使信号量资源数为-1
      • 如果信号量资源数为0,则会阻塞等待,直到有任务释放资源,才能拿到资源并继续向下执行
    4. sem_post

      原型:int sem_post(sem_t *sem);
      功能:
      释放信号量
      参数:
      sem:信号量空间首地址
      返回值:
      成功返回0
      失败返回-1
      

习题

编写三个线程任务,线程一循环打印‘A’,线程一循环打印‘B’,线程一循环打印‘C’,要求打印出的字符顺序总为ABC

代码实现:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<semaphore.h>sem_t sem_wa;
sem_t sem_wb;
sem_t sem_wc;void *thread1(void *arg){while(1){sem_wait(&sem_wa);printf("A\n");sem_post(&sem_wb);}return NULL;
}
void *thread2(void *arg){while(1){sem_wait(&sem_wb);printf("B\n");sem_post(&sem_wc);}return NULL;
}
void *thread3(void *arg){while(1){sem_wait(&sem_wc);printf("C\n");sem_post(&sem_wa);}return NULL;
}int main(void){pthread_t tid1;pthread_t tid2;pthread_t tid3;sem_init(&sem_wa,0,1);sem_init(&sem_wb,0,0);sem_init(&sem_wc,0,0);pthread_create(&tid1,NULL,thread1,NULL);pthread_create(&tid2,NULL,thread2,NULL);pthread_create(&tid3,NULL,thread3,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);sem_destroy(&sem_wa);sem_destroy(&sem_wb);sem_destroy(&sem_wc);return 0;
}

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

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

相关文章

GaussDB 数据库架构师修炼(十三)安全管理(3)-行级访问控制

1 背景行级访问控制特性将数据库的访问控制精确到数据表行级别 &#xff0c;只允许用户查看 、更新或删除特定的行数据。2 实例场景实例以医生只能看到治疗的病人&#xff0c;不能看其它医生的病人为例&#xff1a;1)医院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 与蜂窝网络(手机网络)的核心区别,以及 Wi-Fi 技术未来的发展方向

在日常生活中&#xff0c;我们既离不开家里的 Wi-Fi&#xff0c;也离不开手机的 4G/5G 网络。它们都能把我们连接到互联网&#xff0c;但底层的工作方式却大不相同。一、设计初衷的不同Wi-Fi诞生于 1997 年的 IEEE 802.11 标准&#xff0c;定位是局域网无线替代。它的目标是让电…

C++编程实战:高效解决算法与数据结构问题

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 题目1. 数字统计2. 两个数组的交集3. 牛牛的快递4. 点击消除5. 最小花费爬楼梯6. 简写单词1. 数字统计 BC153 数字统计 #include <iostream> using na…

《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)进阶)》

一、卷积知识扩展 1. 二维卷积 单通道版本 对于单通道输入图像 III (尺寸 HWH \times WHW) 和卷积核 KKK (尺寸 FFF \times FFF)&#xff0c;输出特征图 OOO 的计算公式为&#xff1a; O(i,j)∑m0F−1∑n0F−1I(im,jn)⋅K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可视化图表-pie:从入门到精通(进阶篇)

欢迎来到pyecharts饼图系列教程的进阶篇&#xff01;在上一篇基础教程中&#xff0c;我们学习了饼图的基本概念和简单实现。在本文中&#xff0c;我们将深入探索pyecharts中饼图的六种高级用法和自定义选项&#xff0c;包括环形饼图、富文本标签饼图、滚动图例饼图、环形图、嵌…

【JAVA 核心编程】面向对象高级:类变量与方法 抽象类与接口

一、类变量与类方法&#xff08;静态变量&#xff09; 1&#xff09;类变量 class Child{private String name;//定义一个变量count&#xff0c;是一个类变量&#xff08;静态变量&#xff09;static静态//该变量最大的特点就是会被Child 类的所有对象访问public static int co…

【Java基础面试题】数据类型

Java面试高频总结&#xff1a;基本数据类型深度解析 &#x1f4ca; 八种基本数据类型详解数据类型关键字字节数位数默认值取值范围核心特性字节型byte180-128 ~ 127最小整数类型短整型short2160-32,768 ~ 32,767较少使用整型int4320-2 ~ 2-1 (约21亿)最常用整数类型长整型long8…

攻防世界—unseping(反序列化)

一.审题<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录3分钟速览版&#xff1a;一张表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在线婚纱摄影网站的设计与实现016023190_源码LW_讲解安装

目录前言-本系统介绍已开发项目效果实现截图开发技术详细介绍论文设计框架系统测试核心代码参考示例总结源码获取详细视频演示或者查看其他版本&#xff1a;文章底部获取博主联系方式&#xff01;前言-本系统介绍 利用Python语言、MySQL数据库&#xff0c;Django框架&#xff0…

Python爬虫-爬取政务网站的文档正文内容和附件数据

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以某政务网站为例子。基于Python爬虫采集某政务网站的文档正文内容和其关联的附件数据。 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下…

Python:如何在Pycharm中显示geemap地图?

01 说明 或许在旧版本的python和jupyter中并不能成功. 作为参考&#xff0c;这里给出实验成功的版本&#xff1a;名称版本通道geemap0.36.1conda-forgejupyter1.1.1conda-forgepycharm2024.1.4 (Professional Edition)nullpython3.11.13conda-forge此外&#xff0c;由于显示底图…

力扣3:无重复字符的最长子串

力扣3:无重复字符的最长子串题目思路代码题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 思路 这道题的思路其实是很简单的&#xff0c;最后我们需要得到子串的长度所以我们可以定义两个变量即子串的左边界和右边界这样有了左右边界就…

Git登录配置的详细方法

Git登录绑定主要涉及配置用户信息和设置身份验证。以下是详细的配置方法&#xff1a; 1. 配置基本用户信息 # 全局配置用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的邮箱example.com"# 或者为单个仓库配…

测试工程师的AI转型指南:从工具使用到测试策略重构

测试工程师的AI转型指南&#xff1a;从工具使用到测试策略重构 测试工程师正站在职业转型的十字路口。当GitHub Copilot能自动生成测试用例&#xff0c;AI性能工具能预测系统瓶颈&#xff0c;传统“手动执行用例、人工分析结果”的工作模式正被颠覆。某互联网公司测试团队的调研…

3D打印——给开发板做外壳

3D打印——给开发板做外壳前言一、建立开发板3D模型根据开发板尺寸绘制草图绘制PCB草图&#xff08;手动&#xff09;绘制PCB草图&#xff08;导入&#xff09;拉伸PCB板下载零件3D模型装配零件二、建立外壳3D模型盒子盖子&#xff08;卡扣&#xff09;最终效果三、问题记录前言…

Spring AI架构分析

Spring AISpring AI开发框架提供对接应用与AI模型的集成开发能力&#xff0c;让开发者更加容易地开发智能体以及其他生成式人工智能的应用&#xff1a;模型&#xff08;Model&#xff09;AI模型是算法与数据的集合&#xff0c;用于处理信息以及生成信息&#xff0c;主要AI模型的…

Javar如何用RabbitMQ订单超时处理

RabbitMQ 订单超时处理方案 使用 RabbitMQ 的 TTL 死信队列&#xff08;DLX&#xff09; RabbitMQ 的 TTL&#xff08;Time-To-Live&#xff09; 和 死信队列&#xff08;Dead Letter Exchange&#xff09; 是处理订单超时的常见方案。核心思路是设置消息的过期时间&#xff0…

记录一下 StarRocks 点查的 Profile Metrics

背景 Starrocks 3.5 补充两个点查的 profile 一个是没有开启点查的情况&#xff0c;也就是SET enable_short_circuit false; 一个是开启点查的情况&#xff0c;也就是SET enable_short_circuit true; 其中建表语句如下&#xff1a; CREATE TABLE ac_account (id bigint(20) …

react echarts图表监听窗口变化window.addEventListener(‘resize’)与ResizeObserver()

发生问题场景 系统页面使用tabs标签页,当有多个组件&#xff0c;有使用eCharts图表的页面时&#xff0c;其中的一个页面或其他页面使用了F11的页面全屏&#xff0c;关闭全屏后图表会收缩起来(注:固定eCharts的width、height 的参数值是无影响&#xff0c;按照固定参数大小展示)…