如何解锁锁定括号内的线程

时间:2015-10-22 15:31:38

标签: c# c++ multithreading

我正在尝试将此C ++代码转换为C#:

do{
    if (Node->NextNode == NULL) WaitForSingleObject(pThis->_Event, INFINITE);
    _critSect.Lock();
    if (Node->NextNode == NULL && !bRunning ) 
    {
        _critSect.Unlock(); // can explicitly unlock here
        break;
    }
    _critSect.Unlock();
}while (Node->NextNode == NULL);

在C ++中,我可以显式解锁线程,但C#只有一个括号。如何在破解之前在下面的代码中添加“解锁”功能?

do{
   if (Node->NextNode == null) DataQueueEvent.WaitOne();
   lock (thisLock)
   {
      if (Node->NextNode == null && !bRunning)
      // need to unlock here!!!                      
      break;
   }
} while (Node->NextNode == null);

2 个答案:

答案 0 :(得分:6)

这根本不必要。在C#中,lock语句转换为try / finally,因此无论您如何退出块,只要退出块,锁就会被释放,,因此,当您使用break路径退出时,无需明确释放锁定。

答案 1 :(得分:2)

除了servy所说的内容之外,如果你想看看这是如何在幕后完成的,请看看link

锁定语句将在编译后转换为

bool acquiredLock = false;
try
{
    Monitor.Enter(lockObject, ref acquiredLock);

    // Code that accesses resources that are protected by the lock.

}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}