5.1.2 计数信号量 只要产品的平均生产时间比产品的平均消费时间长,所有的产品就都会被消费掉。但仍然有可能在某个时间段内出现临时的“产品积压”。如产品的生产时间为 20-40 秒(平均30秒),产品的消费时间为 10-30秒(平均 20 秒),总体上看是生产慢、消费快,但在某个时间段,生产速度维持在高水平状态(每20秒生产一个),而消费速度偏偏维持在低水平状态(每30秒消费一个),这时就会临时出现产品积压现象。 二值信号量不能处理“信号积压”现象,未及时响应的信号将会被遗弃,有效响应次数少于实际发出的信号次数。在这种情况下,采用计数信号是一个有效的选择,在总体上能够使控制方对被控制方进行同步控制,在特殊情况下也不失去控制,保证每次控制信号都能够得到响应,尽管响应时间偶尔会有延误。 计数信号最初始值为 0,控制方需要发出同步信号时,就调用“发出一个信号量”的服务函数,使计数信号量的值加 1,被控制方在任务的“同步点”调用“等待一个信号量”的服务函数。如果计数信号量的值不为 0,就将计数信号量减 1,并继续运行下去;如果计数信号量的值为0,便使自己挂起,等待控制方的信号。 计数信号量适用于被控制方不能保证在下一次信号到来之前处理完本次控制方发出的信号,但总体上可以响应所有信号。
|