首页 > 其他分享 >信号量、互斥量

信号量、互斥量

时间:2024-07-27 16:26:43浏览次数:16  
标签:链表 优先级 task1 信号量 互斥 任务

文章目录

是什么?

本质就是队列,但是没有读写操作,有最大值和计数,还有receiver的等待链表,没有send链表,接收放不能通过send链表去唤醒发送方,因为信号量有就发给你,没有就没有了;
image.png

信号量唤醒的顺序问题:
二进制信号量的初始值为0;
计数型信号量的初始值可以设置;
image.png
image.png
信号量的receive_list链表;
未take到拿到信号的任务,都存在链表中等待;
image.png

优先级反转

优先级高的任务无法去打断优先级低的任务;
task2,无需信号量可以直接执行,delay(1000),1s后运行;
现在task2,经过1s的阻塞,优先级高,所以打断task1,而且运行到最后没有删除任务的函数,所以接下来会一直运行task2,task1假设打断前没运行完,没give掉信号量,那永远占着信号量不释放给task3;
最终导致task3任务优先级最高却无法运行;
image.png

如何解决优先级反转的问题?

互斥量只是特殊的信号量;
函数的使用方法和信号量完全一样;

使用互斥量来解决优先级反转

互斥量创建后计数值会提升为1

使用互斥量、task3任务启动时会将正在执行的task1任务的优先级提升到与自己相同,等待task1任务执行完成后task3立即运行,task1执行完成后优先级变回原来;

使用互斥量

/* 创建一个互斥量,返回它的句柄。
 * 此函数内部会分配互斥量结构体 
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateMutex( void );

/* 创建一个互斥量,返回它的句柄。
 * 此函数无需动态分配内存,所以需要先有一个StaticSemaphore_t结构体,并传入它的指针
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );

不管是队列、信号量、互斥量、创建方式和使用方式一样的;
无标题.png

解决I2C互斥访问问题

用全局变量来当互斥量是由隐患的:
比如任务2运行到函数LCD_FlushRegion,全局变量bInUsed已经被置位1,此时任务3创建,优先级高于任务2,开始运行,到while(bInUsed),bInUsed只要任务2不给他置位0,那么任务3的while(bInUsed)会永远卡住;
image.png

改进
在初始化的函数中创建出来(略)
image.pngimage.png

递归锁

互斥量,无法实现谁take谁give;
在这里插入图片描述
使用递归,只能是take的任务去give(只能是拥有者开锁,其他人开不了锁);
在这里插入图片描述
需要配置一个变量才能用递归锁
在这里插入图片描述

标签:链表,优先级,task1,信号量,互斥,任务
From: https://blog.csdn.net/user2604530353/article/details/140683600

相关文章

  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • 手写Semaphore信号量
    publicclassMySemaphore{privateSyncsync;publicMySemaphore(intcount){sync=newSync(count);}publicvoidacquire(){sync.acquireShared(1);}publicvoidrelease(){sync.releaseShared(1);......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • linux 信号量sem 使用示例
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、信号量是什么?二、代码示例1.posix2.systemV总结前言提示:这里可以添加本文要记录的大概内容:信号量主要用于进程间使用信号量:分为posix和systemV信号量posix信号量:sem_open:......
  • ValueError:信号量或锁释放次数过多?
    当我尝试在Cygwin中执行操作时,我会得到ValueError:semaphoreorlockreleasedtoomanytimes我该怎么办?pipinstallmatplotlib更新:UPDATE:$pipinstallmatplotlibDownloading/unpackingmatplotlibYouareinstallinganexternallyhosted......
  • Mutex(互斥锁)
    在这段代码中,Mutex是C#中的一个类,用于提供跨多个线程或跨多个进程的同步。Mutex(互斥锁)是一种同步基元,它允许多个线程或进程安全地访问共享资源。当一个线程或进程获得了一个Mutex的所有权时,其他尝试获取该Mutex的线程或进程将被阻塞,直到该Mutex被释放。csharppublicst......
  • Linux--信号量
    目录1.概念 2.认识接口 3.理论加代码3.1问题背景3.2解决方案3.3代码实现1.概念信号量是什么?想象一下你有一个小小的计数器,这个计数器不是用来数人数或者物品数量的,而是用来控制“访问权”的。这个特殊的计数器,我们就叫它“信号量”。信号量的作用是什么?信号量......
  • Day39.互斥锁
    1.互斥锁_模拟多用户抢票功能流程创建文本文件data,加入字典{"ticket_mum":0},设定余票数'''互斥锁(Lock):多个进程操作同一份数据的时候,会出现数据错乱的问题,针对上述问题,解决方式就是加速处理:核心:将并发变成串行,牺牲效率但是保证了数据的安全'''fromm......
  • linux 互斥锁mutex锁使用示例
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、互斥锁mutex是什么?二、代码示例总结前言提示:这里可以添加本文要记录的大概内容:linux互斥锁mutex锁使用示例,两个线程操作一个全局变量。提示:以下是本篇文章正文内容,下面案例可供......
  • 中断——信号量
    信号量进行中断上下文切换信号量操作是原子操作信号量能阻塞任务,同时也能解除任务的阻塞状态  信号量分类:二值信号量:队列长度为1,处理中断频率低的事件,进行中断上下文切换互斥信号量:针对共享数据的原子操作计数信号量:队列长度为N的二值信号量,对于中......