【问题标题】:Is Boost Thread's boost::unique_lock a scoped lock?Boost Thread 的 boost::unique_lock 是作用域锁吗?
【发布时间】:2012-03-18 15:25:18
【问题描述】:

我了解被boost::mutex::scoped_lock 锁定的变量在超出范围时会自动解锁。

boost::unique_lock怎么样,变量超出范围时会自动解锁吗?

任何人也可以指出该功能的参考。

double x;
boost::mutex x_mutex;

void foo() 
{
    {
         boost::unique_lock<boost::mutex> lock(x_mutex);
         x = rand();
    }    
    ...... some calculation which takes 10 second ......
    ...... is x still locked here??? ......    
}

谢谢。

【问题讨论】:

标签: c++ multithreading boost


【解决方案1】:

scoped_lockunique_lock 在 mutex.hpp 中:

typedef unique_lock<mutex> scoped_lock;

如果获得了锁,析构函数调用unlock()。因此,它会在超出范围时释放。

http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

它不仅提供了 RAII 风格的锁定,它还允许延迟获取锁,直到显式调用 lock() 成员函数,或者尝试以非阻塞方式获取锁,或者超时.因此,仅当锁对象已锁定 Lockable 对象或在 Lockable 对象上采用了锁时,才会在析构函数中调用 unlock()。

【讨论】:

  • 感谢您的回复。如果 boost::unique_lock 在超出范围时自动解锁,那么 boost::unique_lock 和 boost::mutex::scoped_lock 有什么区别?谢谢。
  • 也谢谢指出参考,不过我这里有点迷糊,是不是说析构函数超出范围就自动调用了?
  • scoped_lockunique_lock&lt;mutex&gt; 的类型定义。块 {} 中声明的自动变量在到达块末尾时被破坏,从而使 RAII pattern 成为可能。
  • 另外,在 C++11 中,他们已经摆脱了 typedef,所以现在只有 unique_lock。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多