监控和重新进入(澄清可重入代码和可重入锁定之间的区别)

时间:2016-01-06 06:42:20

标签: c# reentrancy

读取C#中的锁。我认为能够多次获得对同一对象的锁定是可能的,因为监视器是可重入的。维基百科中定义的重入代码的定义似乎不适合这种情况。能否请你帮我理解C#背景下的重新入门以及它如何应用于监视器?根据我的理解,当一个线程获得一个锁时,它不会在关键部分的中间放弃锁 - 即使它产生CPU ......结果,没有其他线程能够获得显示器..重新进入的地方是什么?

2 个答案:

答案 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实际上有很多含义。

在这种情况下,这意味着监视器可以由同一个线程重复输入几次,并在完成相同数量的释放后解锁。