嵌入式学习 Day 25

1.线程分离属性:


    线程结束后,自动回收线程空间

    pthread_attr_init
    int pthread_attr_init(pthread_attr_t *attr);
    功能:
      线程属性初始化

    pthread_attr_destroy
    int pthread_attr_destroy(pthread_attr_t *attr);
    功能:
      线程属性销毁

    pthread_attr_setdetachstate 
    int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    功能:
      设置分离属性 
      PTHREAD_CREATE_DETACHED   分离属性
      PTHREAD_CREATE_JOINABLE   加入属性(默认)

何时用分离属性,何时用加入属性:

1.想得到线程的结束状态(pthread_join可以返回线程的结束值)

2.想让线程同步(pthread_join可以阻塞等待,使线程同步)

 

练习:定义一个学生结构体
      struct student 
      {
        char name[32];
        char sex;
        int age;
        int score;
      };

      创建两个线程,线程1负责从终端接收学生信息
                  线程2负责将学生信息打印在终端

 注意:留意pthread_create(   ,   ,   ,   )的四个参数如何传

2.线程互斥:


    1.互斥锁:

       防止资源竞争


    2.函数接口:


      pthread_mutex_init:
      int pthread_mutex_init(pthread_mutex_t *restrict mutex,
           const pthread_mutexattr_t *restrict attr);
      功能:
        互斥锁初始化
      参数:
        mutex:互斥锁空间首地址
        attr:互斥锁的属性(默认为NULL)
      返回值:
        成功返回0 
        失败返回错误码 

      pthread_mutex_destroy:
      int pthread_mutex_destroy(pthread_mutex_t *mutex);
      功能:
        互斥锁销毁
      参数:
        mutex:互斥锁空间首地址
      返回值:
        成功返回0 
        失败返回错误码 

      pthread_mutex_lock:
      int pthread_mutex_lock(pthread_mutex_t *mutex);
      功能:
        上锁

      pthread_mutex_unlock:
      int pthread_mutex_unlock(pthread_mutex_t *mutex);
      功能: 
        解锁

 

    3.临界资源、临界区:


      加锁解锁中间的代码称为临界资源、临界区
      同一时刻临界资源不能同时执行,只能执行其中一个临界资源代码

    4.原子操作:


      CPU最小的一次不能被任务调度打断的操作称为原子操作

    5.互斥锁只能解决资源竞争的问题,无法同步代码(没有先后执行的顺序关系)

3.死锁:

    概念:多线程操作互斥锁,导致多个线程均无法向下执行的状态称为死锁状态简称为死锁

    死锁产生的四个必要条件:
      1.互斥条件
      2.不可剥夺条件
      3.请求保持
      4.循环等待

    避免产生死锁:
      1.pthread_mutex_trylock 替代 pthread_mutex_lock
      2.加锁顺序保持一致

4.信号量:

    概念:信号量是一种资源,可以被初始化、申请、释放、销毁

    P操作:申请资源
    V操作:释放资源

    sem_init  
    int sem_init(sem_t *sem, int pshared, unsigned int value);
    功能:
      初始化信号量
    参数:
      sem:信号量空间首地址
      pshared:
        0 一个进程中的所有线程间共享
        非0 进程间共享 
      value:
        初始化的值
    返回值:
      成功返回0 
      失败返回-1
    

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

    sem_wait:
    int sem_wait(sem_t *sem);
    功能:
      申请信号量

    sem_post:
    int sem_post(sem_t *sem);
    功能:
      释放信号量

 创建三个线程分别循环打印 A B C,要求打印出来的顺序总是 A -> B -> C

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络实验一 ENSP模拟器使用

实验一 eNSP模拟器的使用 学习目标: 1)掌握eNSP模拟器的基本设置方法 2)掌握使用eNSP搭建简单的端到端(主机)网络的方法 3)掌握在eNSP中使用wireshark捕获IP报文的方法 4)掌握设备的基本配置方…

内网穿透的应用-如何在群晖配置WebDAV实现云同步Zotero科研文献与笔记【内网穿透】

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

C++基础知识(四:类的学习)

类 类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。 【1】定义 class 类名 { 访问权限:成员属性; 访问权限:成员方法; }访问权限: public:共有的,类内、类外和子类中都可以访问 private:私有…

运维的利器–监控–zabbix–grafana

运维的利器–监控–zabbix–grafana 一、介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具 , 可以通过将采集的数据查询然后可视化的展示 。zabbix可以作为数据源,为grafana提供数据,然后grafana将数据以图表或者其他形式展示出来。zabbix和gra…

AI:142-开发一种智能家居系统,通过语音识别和情感分析实现智能互动

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。 容器:各种数据结构,如vector、list、deque、set、map等,用来存放…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…

AI赚钱套路总结和教程

最近李一舟和Sora 很火,作为第一批使用Sora赚钱的男人,一个清华学美术的跟人讲AI,信的人太多了,钱太好赚了。3年时间,李一舟仅通过卖课就赚了1.75亿元,其中《每个人的人工智能课》收入2786万元,…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年,由Boyce和Chamberlin提出 1975~1979,IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

将python两个版本添加环境变量(Mac版)

在运行程序的时候,可能不知道选择哪个版本的程序来执行,先添加环境变量,然后进行选择。 1、查看python安装路径 which python which python3 来查看各个版本的安装位置 2、编辑环境变量配置文件 Macos使用默认终端的shell是bash&#xff0c…

leetcode 2.合并两个有序链表

1..题目:合并两个有序链表; 2.用例: 3.解题思路: (1)函数头:参数是两个链表;返回值为 链表指针 ListNode*; (2)函数体: 1.首先比较…

第十四天-redis操作

目录 1.安装 2.创建链接 1.创建链接 2.连接池链接 3.操作指令 1.字符串操作 set/get 2.expire 3.delete 4.mset/mget 5.list列表操作 6.set集合操作: 7.hash的操作 8.事务 1.安装 1. 安装redis-py模块:: pip install redis 2.参…

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查…

Java中web的css、js、img等静态资源引入详细操作教程

本篇文章主要讲解:Java中web的css、js、img等静态资源引入详细操作教程 日期:2024年2月27日 作者:任聪聪 java中web单体项目静态资源webjar引入形式说明 说明:通过webjar进行静态资源的导入,使用maven进行版本的管理。…

FPGA IO命名与Bank划分

文章目录 IO的命名IO物理命名IO功能命名 Bank简介FPGA器件功能命名与Bank划分查找XILINXIntelLATTICE IO的命名 IO物理命名 FPGA的IO物理命名规则,也就是我们做管脚约束时候的命名。芯片通常是长方体或者正方体,所以命名通常采用字母数字组合的方式&am…

Jquery中的事件与动画

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章目标 使用常用简单事件制作网页特效使用鼠标事件制作主导航特效使用hover()方法制作下拉菜单特效使用鼠标事件及动画制作页面特效 一.Jquery事件概述 二.基础事件 鼠标事件 演示案例&…

pageHelper分页查询

文章目录 前言一、集成1.引入库2.配置yml 二、编码1.Controller2.Service3.Mapper4.Mapper.xml5.StudentResult 三、测试1.根据页码和页数2.根据name 总结 前言 本篇文章介绍在java中使用pageHelper完成分页的功能。 使用的数据库为mysql,持久层框架mybatis。 一、集成 1.引入…

猫头虎分享已解决Bug || RAID阵列故障(RAID Array Failure):RAIDError, DiskArrayFailure

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Kafka入门二——SpringBoot连接Kafka示例

实现 1.引入maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

TensorRT及CUDA自学笔记003 NVCC及其命令行参数

TensorRT及CUDA自学笔记003 NVCC及其命令行参数 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; NVCC是一种编译器&#xff0c;基于一些命令行参数可以将使用PTX或C语言编写的代码编译成可…
最新文章