信号量与互斥量的区别

多任务间同步的方式包括关中断,调度器上锁, 互斥量(mutex),信号量,消息队列几种, 其中互斥量和信号量使用使用方式相近,连概念和实现都有些近似, 所以没有扎实操作系统背景知识的同学常常分不清出他们的区别,容易混淆, 下面简单分析以下.


1.互斥量

    互相斥量是管理临界资源的一种有效手段, 因为互斥量是独占的, 所以在一个时刻只允许一个线程占有互斥量,利用这个性质来实现共享资源的互斥量保护,任何时刻只允许一个线程获得互斥量对象,未能够获得互斥量对象的线程被挂起在该互斥量的等待线程队列上,这一点和1资源信号量是相同的, 但互斥量有所有者的概念,高优先级的任务可以在获取互斥量时通过对比所有者的优先级是否高于自己来决定是否提升所有者的优先级。  所以互斥量可以有效对付优先级反转的问题。


2.信号量

 信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作自于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。


小结:

  关于所有者的概念,其实我也不是很清楚,只是最近看了一下FreeRTOS 信号量头文件的一些注释, 有些感悟和收获, 原文在 freertoscode/source/include/semphr.h中。 

 * This type of semaphore can be used for pure synchronisation between tasks or
 * between an interrupt and a task.  The semaphore need not be given back once
 * obtained, so one task/interrupt can continuously 'give' the semaphore while
 * another continuously 'takes' the semaphore.  For this reason this type of
 * semaphore does not use a priority inheritance mechanism.  For an alternative
 * that does use priority inheritance see xSemaphoreCreateMutex().
 *

大概意思是说, sem和mutex的使用方式不同, 对于同一个上下文内来说,mutex的获取和释放必须成对调用, 获取次数和释放次数必须一样,强调所有权的概念。

sem则没有这些要求,可以一个上下文执行释放,另一个上下文执行获取, 强调的是资源数的概念。

猜你喜欢

转载自blog.csdn.net/tugouxp/article/details/68951576