如何解锁锁括号内的线程

How to unlock a thread within lock brackets

本文关键字:线程 何解锁 解锁      更新时间:2023-10-16

我正在尝试将这段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);

完全没有必要。在c#中,lock语句转换为try/finally,因此无论您如何退出块,锁都会在退出块时被释放,因此当您使用break路径退出时无需显式释放锁。

除了servy所说的,如果你想了解它是如何在幕后完成的,请查看这个链接

一旦编译为 ,锁语句将被转换为 。
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);
    }
}