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

自学嵌入式第三十天:Linux系统编程-线程的控制

一、线程控制:互斥和同步

        对于线程的共享资源的竞争的处理;

        进程也能用,对进程竞争的系统资源的分配;

二、互斥

        1.互斥:在多线程中对临界资源的排他性(独占)访问;

        2.互斥机制(互斥锁):以保证临界资源的访问控制;

        3.pthread_mutex_t mutex;互斥锁;

                (1)初始化

                int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

                pthread_mutex_t *restrict mutex:是一个pthread_mutex_t型的结构体;

                const pthread_mutexattr_t *restrict attr:初始化属性;

                成功返回0;

                (2)销毁

                int pthread_mutex_destroy(pthread_mutex_t *mutex);

                (3)上锁

                int pthread_mutex_lock(pthread_mutex_t *mutex);

                必须与解锁配套用;

                加锁后的代码到解锁部分的代码属于原子操作,让cpu在一次调度内走完,此时其他线程不能操作本段代码;

                成功返回0;

                (4)解锁

                int pthread_mutex_unlock(pthread_mutex_t *mutex);

                (5)trylock

                int pthread_mutex_trylock(pthread_mutex_t *mutex);

                非阻塞性锁;

                成功返回0;

        4.互斥锁要尽量小内容;一般不要做耗时的操作;不要在里面有延时;

三、同步

        1.同步是有一定先后顺序的对资源的排他性访问;可以理解为加了条件的互斥;

        2.通过信号量做同步;

        3.swmaphore信号量的定义:

        头文件#include<semaphore.h>

        int sem_init(sem_t *sem,int pshared,unsigned int value);

        sem:需要初始化的信号量;

        pshared:0表示线程间使用信号量,非0表示进程间使用信号量;

        value:信号量的初值;一般都是二值信号量(0/1)1时可以通过执行;可以在用作计数信号量时赋计数数值;

        成功返回0,失败返回-1;

        4.信号量的PV操作:

        P是申请资源:申请一个二值信号量(+1)对应函数sem_wait();

        V是释放资源:释放一个二值信号量(-1)对应函数sem_post();

        int sem_wait(sem_t *sem);

        判断当前sem信号是否有资源可用;如果有则申请并运行,如果没有则堵塞等待;

        sem申请后会自动执行类似sem--的操作,使信号量变小;

        成功返回0,失败返回-1;

        int sem_post(sem_t *sem)

        把sem信号量资源释放;自动执行类似sem++的操作;不会堵塞;

        成功返回0,失败返回-1;

        5.销毁

        int sem_destroy(sem_t *sem);

        将使用完毕的sem信号量销毁;

        成功返回0,失败返回-1;        

四、产生死锁的四个必要条件:

        1.互斥条件:一个资源每次只能被一个进程使用。

        2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

        3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

        4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

http://www.dtcms.com/a/355734.html

相关文章:

  • 因果推断在解决多触点归因问题上的必要性
  • 利用ollama部署本地大模型 离线使用
  • 告别Java依赖!GISBox三维场景编辑+服务发布一站式工具横评
  • 模型汇总-数学建模
  • echarts碰到el-tabs首次加载echarts宽度只有100px
  • LoRA模型的可训练参数解析(61)
  • 杂记 08
  • CnSTD+CnOCR的联合使用
  • vsgCs显示谷歌全球倾斜模型-节点
  • 9 从 “内存怎么存” 到 “指针怎么用”:计算机内存编址机制 + C 语言指针核心 + memory 模拟实现
  • “AI+制造”政策下,户外智能清洁如何跑出加速度?
  • 20250828-学习JumpServer开源堡垒机使用:统一访问入口 + 安全管控 + 操作审计
  • 复杂BI报表SQL
  • 集成电路学习:什么是TensorFlow
  • MCP Factory——专业 MCP Server 开发平台,正式发布,免费下载!
  • 一站式爬虫MCP服务器助力AI市场分析师
  • 微服务相关面试题
  • ComfyUI ControlNet 保姆级教程:开箱即用的示例工作流,精准控制AI图像生成
  • 记录git报错ssh: connect to host github.com port 22: Connection timed out,已解决
  • P3373 【模板】线段树 2
  • l六步完成麒麟操作系统挂载本地REPO源
  • 软考 系统架构设计师系列知识点之杂项集萃(134)
  • IPv6过渡技术IPv6 over IPv4
  • 【数据结构与算法】LeetCode 20.有效的括号
  • 跨网络通信:路由器如何实现全球互联
  • QT控件:【控件概述】【QWidget核心体系】【按钮类控件】【显示类控件】
  • 实战回忆录从webshell开始突破边界
  • 3D血管图像处理与连接系统
  • Odoo AI 智能查询系统
  • 【LeetCode每日一题】160.相交链表 206. 反转链表