【问题标题】:How to unlock a thread within lock brackets如何解锁锁定括号内的线程
【发布时间】:2016-01-21 22:59:39
【问题描述】:

我正在尝试将此 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# c++ multithreading


    【解决方案1】:

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

    【讨论】:

    • 事实上,c++ 代码真的很糟糕。它应该将 critsect 包装在一个类中,这样它也会在范围退出时释放
    • 谢谢。这应该是显而易见的。 )
    【解决方案2】:

    除了 servy 所说的之外,如果您想了解这是如何在幕后完成的,请查看 link

    lock 语句一旦编译就会被转换成

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多