同步原语“锁定一次”

时间:2011-03-09 06:51:26

标签: c# .net parallel-processing

我需要一个类似于Monitor的同步原语,但不需要像我输入它那样多次退出它。如果我通过一个线程进入Monitor,然后通过同一个线程重新输入它,我将需要两次调用Monitor.Exit。但我需要通过一次电话退出。

现在我使用某种Monitor包装器,如果它已经被当前线程输入,则不会进入Monitor(这就是为什么我可以通过一次调用退出它)。但是.NET Framework可能包含一个吗?

2 个答案:

答案 0 :(得分:1)

我很想知道为什么在没有同等数量的Monitor.Enter来电的情况下多次拨打Monitor.Exit。通常,任何此类同步代码都如下所示:

try
{
    Monitor.Enter(lockObject);
    // some code that needs to be synchronized
}
finally
{
    Monitor.Exit(lockObject);
}

假设您使用try / finally,只要您使用Monitor.Enter )获取锁定,我就无法理解为什么你需要这个“锁定一次”的课程。

事实上,你基本上不应该自己做这个,因为一个更简单的方法基本上做同样的事情是使用lock语句:

lock (lockObject)
{
    // some code that needs to be synchronized
}

那就是说,我当然可能会遗漏一些东西。

答案 1 :(得分:0)

你怎么知道它是同一个线程,如何确保当这个线程离开时它会在它离开之前调用exit?

从它的外观来看,你只需要具有锁定的其他东西(在外层)。也许是一个“入口点”方法,它锁定并调用另一个具有工作主要功能的方法,然后你可以多次调用另一个方法,而不必通过锁定。

public static void MethodOne()
{
  lock (lockObj)
  {
    MethodTwo();
  }
}

private static void MethodTwo()
{
  //This method can be called multiple times
  //without going past MethodOne and so you only
  //lock once
}

private static void MethodThree()
{
}