因为信号量的设计过程中,获取一个信号量需要执行多个命令组成的流水,这样容易形成竞争条件。
为了消除信号量实现中所有可能出现的竞争条件,构建一个正确的计数信号量,需要在 信号量时,添加带有短暂超时时间的锁。如果程序获取了锁,那么就可以执行正常信号量获取的命令流水;如果程序没有能够获取这个带有短暂超时的锁,那么获取信号量的操作也将宣告失败。
代码结构如下:
del acquire_semaphore_with_lock(conn,semname,limit,timeout=10):
identifier=acquire_lock(conn,semname,acquire_timeout=.01)
if identifier:
try:
return acquire_fair_semaphore(conn,semname,limit,timeout)
finally:
release_lock(conn,semname,identifier)