一直对信号量模模糊糊,今天觉得这段描述不错,大家讨论讨论。 下面是节选的一本描述UCOS上对信号量的叙述。
一般来说,对信号量只能实施3种操作:初始化,也可称作建立;等信号,也可称作挂起;给信号或者发信号。信号量初始化时,要给信号量赋初值,等待信号量的任务表应清为空。
想得到信号量的任务,须执行“等待”操作。如果该信号量有效(信号量值大于0),则信号量值减1,任务得以继续运行。如果信号量的值为0,等待信号量的任务就被列入等待信号量任务表。如果等待时间超过了某一设定值,该信号量还是无效,则等待信号量的任务进入就绪态,准备运行,并返回出错代码(指出发生了等待超时错误)。
任务以“发信号”操作释放信号量。如果没有任务等待信号量,那么信号量的值仅是简单的加1;如果有任务等待该信号量,那么就会有一个任务进入就绪态,信号量的值也就不加1。于是钥匙给了等待信号量的诸任务中的一个任务。至于给了哪个任务,要看内核是如何调度的。 |