多线程编程指南

计数信号量概述

从概念上来说,信号量是一个非负整数计数。信号量通常用来协调对资源的访问,其中信号计数会初始化为可用资源的数目。然后,线程在资源增加时会增加计数,在删除资源时会减小计数,这些操作都以原子方式执行。

如果信号计数变为零,则表明已无可用资源。计数为零时,尝试减小信号的线程会被阻塞,直到计数大于零为止。

表 4–7 信号例程

操作

相关函数说明

初始化信号 

sem_init 语法

增加信号 

sem_post 语法

基于信号计数阻塞 

sem_wait 语法

减小信号计数 

sem_trywait 语法

销毁信号状态 

sem_destroy 语法

由于信号无需由同一个线程来获取和释放,因此信号可用于异步事件通知,如用于信号处理程序中。同时,由于信号包含状态,因此可以异步方式使用,而不用象条件变量那样要求获取互斥锁。但是,信号的效率不如互斥锁高。

缺省情况下,如果有多个线程正在等待信号,则解除阻塞的顺序是不确定的。

信号在使用前必须先初始化,但是信号没有属性。