C ++中C#的“锁定”

时间:2019-05-06 14:38:37

标签: c++ multithreading

如果我想在C#中锁定某些内容,我会这样做

private readonly object _listManagerLock = new object();

lock (_listManagerLock)
      {
          Console.WriteLine("startin determening");
          AssignArray(log._algorithm);
          Console.WriteLine("ending determening");
      }  

完全线程安全,不会出错。有没有办法在C ++中实现呢?

1 个答案:

答案 0 :(得分:9)

C ++没有与lock关键字等效的关键字。您需要创建一个std::mutex实例,并将其锁定:

private:
    std::mutex _listManagerLock;

// ...

您可以手动锁定和解锁它:

_listManagerLock.lock();
// ...
_listManagerLock.unlock();

但是不建议这样做,因为在某些情况下(例如,抛出异常或仅忘记unlock()时),互斥锁可能会锁定。相反,您应该使用std::lock_guard

std::lock_guard<std::mutex> lock(_listManagerLock);
// ...

当退出当前范围时,锁将自动释放。要强制作用域并获取与C#代码等效的内容,您可以这样做:

{
    std::lock_guard<std::mutex> lock(_listManagerLock);
    // ...
}