从最简单的形式来看,信号量仅仅是一个被更改的普通变量,用于指示公共资源的状态。信号量可以被视为一种资源共享机制,当您拥有有限的资源实例并希望管理多个线程的访问时,可以使用该机制。它们更多地是一种信号传递机制,用于控制对给定数量资源实例的访问。
信号量具有以下属性:
- 在初始化时,您需要设置初始计数(大于或等于 0)和最大限制。
- “释放 (Give)”将增加信号量计数,除非计数已达到最大限制,在这种情况下信号将不会增加。“释放 (Give)”可以从任何线程或中断服务例程 (ISR) 中执行。
- “获取 (Take)”将减少信号量计数,除非信号量不可用(计数为零)。任何试图获取不可用信号量的线程都需要等待,直到其他线程使其可用(通过释放信号量)。“获取 (Take)”只能在线程中执行,不能在 ISR 中执行(内核确实允许 ISR 获取信号量,但如果信号量不可用,ISR 绝不能尝试等待)。
- 信号量没有所有权。这意味着信号量可以由一个线程获取,并由任何线程释放。获取信号量的线程不一定必须是释放信号量的线程。
- 获取信号量的线程不具备优先级继承的资格,因为获取线程并不拥有该信号量,且任何其他线程都可以释放该信号量。
下图显示了信号量的属性
信号量 注意
您可以初始化一个“满”信号量(计数等于限制值),以限制能够同时执行临界区的线程数量。
您也可以初始化一个“空信号量”(计数等于 0,限制值等于 1),以创建一个门禁,在信号量首先增加之前,任何等待的线程都不得通过。