为什么不建议在finally中调用二进制信号量的release()方法

为了确保Lock被解锁,建议从finally子句中调用unlock()方法:

lock.lock();
try{
  // critical section which may throw exceptions
} finally {
  lock.unlock();
}

这是为了避免可能的死锁,以防从关键部分的代码抛出异常。

为什么在等效场景中对于二元信号量不同意的做法?

mutex.acquire();
try{
  // critical section which may throw exceptions
} finally {
  mutex.release();
}

因为对于二进制信号量的等待成功的线程来说,它不是必须的。 线程不像自己获得互斥体那样拥有信号量单元 - 任何线程都可以发出信号量(因此它们在生产者 - 消费者队列中常用)。


我会说这通常是处理它们的最好方法。 然而,信号量可以通过单独的线程来释放,因此在某些高级用例中,这种模式是不可能的。 (也就是说,锁lock()unlock()调用可能在单独的方法中,以至于finally块也是不可能的)。


我会建议这样做。 但是信号量和锁的主要区别在于没有信号量的所有者。 意味着获得信号量的线程可能不是释放信号的线程,这没关系。 我会建议总是在某个时候在finally块中释放

链接地址: http://www.djcxy.com/p/90125.html

上一篇: Why it isn't advised to call the release() method of a binary semaphore from inside a finally

下一篇: .NET Core vs Mono