【问题标题】:Do I need to call unlock() in the Boost thread function?我需要在 Boost 线程函数中调用 unlock() 吗?
【发布时间】:2012-11-07 15:17:29
【问题描述】:

我在使用 C++ Boost 线程的地方有以下代码行:

void threadFunc()
{
boost::mutex::scoped_lock lock(m_Mutex);
//some code here...
condition.notify_one();
} 

那么我应该在最后一行之前调用 unlock() 函数吗,如下所示?如果我不调用 unlock() 有什么区别?

void threadFunc()
{
boost::mutex::scoped_lock lock(m_Mutex);
//some code here...
lock.unlock();
condition.notify_one();
} 

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    不——scoped_lock 类的重点是锁与范围相关联——即,当scoped_lock 对象超出范围时,锁会自动释放。这确保(例如)如果任何中间代码抛出异常,锁仍将被释放。

    【讨论】:

    • 感谢 Jerry 的快速响应。那么问题来了:在Boost线程中,互斥锁()和解锁()这对几乎没用,因为作用域锁在超出作用域时会自动释放锁,对吧?
    • @tonga lock() 和 unlock() 对于不能使用 scoped_lock 的情况(例如,锁定一个函数并解锁另一个函数)很有用。
    • 感谢 Angew 的 cmets。
    • @tonga:事实上,互斥锁的 lock() 和 unlock() 是 scoped_lock 用来完成工作的。例如,请参阅我的 previous answers 之一中的 lock 类。它可能与 Boost 的 scoped_lock 不太相同,但无论如何都是一个非常相似的想法。
    【解决方案2】:

    没有。锁是有范围的,所以当它超出范围时它会“自动”解锁。请参阅 RAII。

    http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多