为什么不建议在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