锁定信号量对象是否有意义?
Does locking on a Semaphore object make any sense?
我遇到了一个使用信号量作为锁定对象的代码。我问过我的同事,他们说,如果我们想监视锁的状态,或者如果代码深处发生奇怪的异常并且 CLR 无法回滚堆栈,或者其他什么,这可能是有意义的像这样,锁没有正常释放,我们可以手动释放。
我从来没有听说过这些现象,也没有发现这些,所以我对这整件事很怀疑。我认为这只是一种不好的做法,因为您会对如何使用信号量对象感到困惑。有人可以证实这一点吗?
private Semaphore _semaphore = new Semaphore(0, 1);
public void DoSomethingThreadSafe()
{
lock (_semaphore)
{
//some code
}
}
锁定信号量 object 与任何其他 object 类型相比不会带来任何额外的好处,但可能会损害可读性,因为它不是执行此类操作的惯用方式:
if we wanted to monitor the state of our locks
lock
机制与用于同步的 object 类型完全无关,并且不会尝试将 Semaphore
实例与另一个实例区分开来以执行某些操作Semaphore
-特定操作。实际发生的情况是,Monitor.Enter
和 Monitor.Exit
方法用于 lock
构造的生成代码中,并且这些方法在内部与 CLR object header (它是任何引用类型内存布局的一部分)and/or 同步块,它是实例 header 引用的特殊 table 中的一个条目。因此,除了用于获取由 CLR 维护的内部同步状态的 hacky 方法之外,没有其他方法可以监视用于同步的 object 的状态。
or if a weird exception happened deep in the code and the CLR could not rolling back the stack, or something like that, and the lock is not released properly, we can release it manually
同样,作为 Semaphore
实例的信号量状态与同步状态无关 object 后者恰好是信号量实例内存布局的一部分,并且是由 lock
机制内部使用,进入或离开 lock
块不会导致更改信号量计数,释放信号量也不会影响同步 object used for lock
。因此,在这种情况下使用信号量不会带来任何好处,而且如果在 CRL 无法展开堆栈时出现问题,应用程序代码能否在这种情况下做某事是非常值得怀疑的。
我遇到了一个使用信号量作为锁定对象的代码。我问过我的同事,他们说,如果我们想监视锁的状态,或者如果代码深处发生奇怪的异常并且 CLR 无法回滚堆栈,或者其他什么,这可能是有意义的像这样,锁没有正常释放,我们可以手动释放。
我从来没有听说过这些现象,也没有发现这些,所以我对这整件事很怀疑。我认为这只是一种不好的做法,因为您会对如何使用信号量对象感到困惑。有人可以证实这一点吗?
private Semaphore _semaphore = new Semaphore(0, 1);
public void DoSomethingThreadSafe()
{
lock (_semaphore)
{
//some code
}
}
锁定信号量 object 与任何其他 object 类型相比不会带来任何额外的好处,但可能会损害可读性,因为它不是执行此类操作的惯用方式:
if we wanted to monitor the state of our locks
lock
机制与用于同步的 object 类型完全无关,并且不会尝试将 Semaphore
实例与另一个实例区分开来以执行某些操作Semaphore
-特定操作。实际发生的情况是,Monitor.Enter
和 Monitor.Exit
方法用于 lock
构造的生成代码中,并且这些方法在内部与 CLR object header (它是任何引用类型内存布局的一部分)and/or 同步块,它是实例 header 引用的特殊 table 中的一个条目。因此,除了用于获取由 CLR 维护的内部同步状态的 hacky 方法之外,没有其他方法可以监视用于同步的 object 的状态。
or if a weird exception happened deep in the code and the CLR could not rolling back the stack, or something like that, and the lock is not released properly, we can release it manually
同样,作为 Semaphore
实例的信号量状态与同步状态无关 object 后者恰好是信号量实例内存布局的一部分,并且是由 lock
机制内部使用,进入或离开 lock
块不会导致更改信号量计数,释放信号量也不会影响同步 object used for lock
。因此,在这种情况下使用信号量不会带来任何好处,而且如果在 CRL 无法展开堆栈时出现问题,应用程序代码能否在这种情况下做某事是非常值得怀疑的。