读取C#中的锁。我认为能够多次获得对同一对象的锁定是可能的,因为监视器是可重入的。维基百科中定义的重入代码的定义似乎不适合这种情况。能否请你帮我理解C#背景下的重新入门以及它如何应用于监视器?根据我的理解,当一个线程获得一个锁时,它不会在关键部分的中间放弃锁 - 即使它产生CPU ......结果,没有其他线程能够获得显示器..重新进入的地方是什么?
答案 0 :(得分:3)
@Zbynek Vyskovsky - kvr000 已经解释了关于Monitor
的重入意味着什么。
维基百科将“reentrant mutex”(递归锁定)定义为:
特殊类型的互斥(互斥)设备,可以由同一进程/线程多次锁定,而不会导致死锁。
这是一个帮助您想象这个概念的小例子:
void MonitorReentrancy()
{
var obj = new object();
lock (obj)
{
// Lock obtained. Must exit once to release.
// No *other* thread can obtain a lock on obj
// until this (outermost) "lock" scope completes.
lock (obj) // Deadlock?
{
// Nope, we've just *re-entered* the lock.
// Must exit twice to release.
bool lockTaken = false;
try
{
Monitor.Enter(obj, ref lockTaken); // Deadlock?
// Nope, we've *re-entered* lock again.
// Must exit three times to release.
}
finally
{
if (lockTaken) {
Monitor.Exit(obj);
}
// Must exit twice to release.
}
}
// Must exit once to release.
}
// At this point we have finally truly released
// the lock allowing other threads to obtain it.
}
答案 1 :(得分:2)
Reentrancy实际上有很多含义。
在这种情况下,这意味着监视器可以由同一个线程重复输入几次,并在完成相同数量的释放后解锁。