因为信号量的设计过程中,获取一个信号量需要执行多个命令组成的流水,这样容易形成竞争条件。

为了消除信号量实现中所有可能出现的竞争条件,构建一个正确的计数信号量,需要在 信号量时,添加带有短暂超时时间的锁。如果程序获取了锁,那么就可以执行正常信号量获取的命令流水;如果程序没有能够获取这个带有短暂超时的锁,那么获取信号量的操作也将宣告失败。

代码结构如下:

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)

05-20 06:09