分类
美股期权交易基础

二进制信号

互斥: 是厕所的关键。一个人可以拥有钥匙 - 占用厕所 - 当时。完成后,该人员将(释放)密钥提供给队列中的下一个人。 正式说:“互斥锁通常用于序列化对一部分重入代码的访问,这些代码不能由多个线程同时执行。互斥对象只允许一个线程进入受控部分,强制其他线程尝试访问该部分要等到第一个线程退出该部分。“参考:Symbian 开发人员库 (互斥体实际上是一个值为 1 的信号量。) 信号: 是免费相同的厕所钥匙的数量。例如,我们说有四个带有相同锁和钥匙的马桶。信号量计数 - 键数 - 在开始时设置为 4(所有四个厕所都是免费的),然后计数值随着人们的进入而减少。如果所有厕所都已满,即。没有剩余的自由键,信号量计数为 0. 现在,当 eq。一个人离开厕所,信号量增加到 1(一个自由键),并给予队列中的下一个人。 正式地说:“信号量将共享资源的同时用户数量限制为最大数量。线程可以请求访问资源(递减信号量),并且可以发信号通知他们已经完成了使用资源(递增信号量)。 “参考:Symbian 开发人员库

二进制信号

它们不是一回事。它们用于不同的目的!
虽然两种类型的信号量都具有完整 / 空状态并使用相同的 API,但它们的使用方式却截然不同。

互斥信号量
互斥信号量用于保护共享资源(数据结构,文件等)。

Mutex 信号量由接受它的任务 “拥有”。如果任务 B 尝试 semGive 当前由任务 A 持有的互斥锁,则任务 B 的调用将返回错误并失败。

二进制信号量
Binary Semaphore 解决了一个完全不同的问题:

  • 任务 B 等待发生某事(例如传感器被绊倒)。
  • 传感器跳闸和中断服务程序运行。它需要通知行程的任务。
  • 任务 B 应该运行并对传感器跳闸采取适当的措施。然后回去等。

请注意,对于二进制信号量,B 可以使用信号量和 A 来提供它。
同样,二进制信号量不保护资源不被访问。给予和获取信号量的行为从根本上是分离的。
对于相同的任务来说,通常对同一个二进制信号量的给予和接受没有多大意义。

互斥:

是厕所的关键。一个人可以拥有钥匙 - 占用厕所 - 当时。完成后,该人员将(释放)密钥提供给队列中的下一个人。

正式说:“互斥锁通常用于序列化对一部分重入代码的访问,这些代码不能由多个线程同时执行。互斥对象只允许一个线程进入受控部分,强制其他线程尝试访问该部分要等到第一个线程退出该部分。“参考:Symbian 开发人员库

(互斥体实际上是一个值为 1 的信号量。)

信号:

是免费相同的厕所钥匙的数量。例如,我们说有四个带有相同锁和钥匙的马桶。信号量计数 - 键数 - 在开始时设置为 4(所有四个厕所都是免费的),然后计数值随着人们的进入而减少。如果所有厕所都已满,即。没有剩余的自由键,信号量计数为 0. 现在,当 eq。一个人离开厕所,信号量增加到 1(一个自由键),并给予队列中的下一个人。

正式地说:“信号量将共享资源的同时用户数量限制为最大数量。线程可以请求访问资源(递减信号量),并且可以发信号通知他们已经完成了使用资源(递增信号量)。 “参考:Symbian 开发人员库

Mutex 只能由获取它的线程释放,而您可以从任何其他线程(或进程)发出信号量信号,因此信号量更适合某些同步问题,如 producer-consumer。

原创 FreeRTOS 的互斥信号量与二进制信号量(原创)

二进制信号量相关宏或函数:
vSemaphoreCreateBinary // Macro that creates a Binary semaphore
xSemaphoreTake // Macro to obtain a semaphore
xSemaphoreGive // Macro to release a semaphore
xSemaphoreGiveFromISR // Macro to release a semaphore (used from 二进制信号 ISR)

互斥型信号量相关宏或函数:
xSemaphoreCreateRecursiveMutex // Macro that creates a mutex semaphore
xQueueTakeMutexRecursive // obtain a semaphore
xQueueGiveMutexRecursive // release a semaphore

注: 二进制信号量与互斥型信号量比较

Binary semaphores and mutexes are very similar but have some subtle differences: Mutexes include a priority inheritance mechanism , binary semaphores do not. This makes binary semaphores the better choice for implementing synchronisation (between tasks or between tasks and an interrupt), and mutexes the better choice for implementing simple mutual exclusion.
A binary semaphore need not be given back once obtained, so task synchronisation can be implemented by one task/interrupt continuously 'giving' the semaphore while another continuously 'takes' the semaphore.
T he priority of a task that 'takes' a mutex can potentially be raised if another task of higher priority attempts to obtain the same mutex . The task that owns the mutex 'inherits' the priority of the task attempting to 'take' the same mutex. This means the mutex must always be 'given' back - otherwise the higher priority task will never be able to obtain the mutex, and the lower priority task will never 'disinherit' the priority.

二进制信号量 实现任务互斥: 打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量()二进制信号 ,必须将打印机房的门关起来( 进入临界段 ),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而 互斥型信号量 由于必须由取得信号量的那个任务释放,故不会出现其他任务错误地释放了信号量的情况出现,故 不需要有临界段 。 互斥型信号量是二进制信号量的子集 。)

========================================
Example usage:
xSemaphoreHandle xSemaphore = NULL;
// A task that creates a semaphore.
void vATask( void * 二进制信号 pvParameters )
/* Create the semaphore to guard a shared resource.
As we are using the semaphore for mutual exclusion
we create a mutex semaphore rather than a binary
semaphore.*/
xSemaphore = xSemaphoreCreateMutex();
>
// A task that uses the semaphore.
void vAnotherTask( void * pvParameters )
// . Do other things.
if( xSemaphore !二进制信号 = NULL )
/* See if we can obtain the semaphore. If the semaphore
is not available wait 10 ticks to see if it becomes free.*/
if(xSemaphoreTake(xSemaphore,(portTickType)10)
==pdTRUE)
/* We were able to obtain the semaphore and can now
access the shared resource.
We have finished accessing the shared resource.
Release the semaphore.*/
xSemaphoreGive( xSemaphore );
>
else
/* We could not obtain the semaphore and can therefore
not access the shared resource safely. */
>
>
>

什么是二进制确知信号的最佳形式

互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。 二进制信号量,一个任务申请成功后,可以由另一个任务释放。二进制信号量实现任务互斥: 打印机资源只有一个,ABC三个任务共享,当A取得使用权后,为了防止其他任务错误地释放了信号量,必须将打印机房的门关起来(进入临界段),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而互斥型信号量由于必须由取得信号量的那个任务释放,故不会出现其他任务错误地释放了信号量的情况出现,故不需要有临界段。互斥型信号量是二进制信号量的子集。) 二进制信号量实现任务同步: A任务一直等待信号量,B任务定时释放信号量,完成同步功能.

二进制信号量

Copyright © 2006-2022 All Rights Reserved RT-Thread Copyrights 沪ICP备13014002号-1 订阅该版 本网站基于FastAdmin搭建