可以定义任意数量的信号量(受限于RAM)。每个信号量通过其内存地址进行引用。
信号量的关键属性如下:
信号量必须先初始化再使用。信号量的计数必须被初始化为非负值,且小于等于边界值。
信号量可以在线程或中断中进行释放(give) 。释放信号量会使其计数递增,直到计数达到上限。
线程可以获取(take) 信号量。获取信号量时其计数会递减,除非信号量无效(例如为零)。当信号量不可用时,线程可以等待,直到获取到信号量。多个线程可以同时等待某个无效的信号量。当信号量可用时,它会被优先级最高的、等待时间最久的线程获取到。
NOTE
可以初始化一个full信号量(计数值等于最大值),用来限制某段代码的并发执行数量。也可以初始化一个空信号量(计数值为0),用来阻塞线程,直到该信号量释放。
NOTE
内核允许在中断服务函数中获取信号量,但当信号量无效时,不能在中断服务函数中阻塞等待该信号量。
线程相关的使用示例参考semaphores_sample。