【问题标题】:Usage of boost::unique_lock::timed_lockboost::unique_lock::timed_lock 的使用
【发布时间】:2013-01-07 16:47:47
【问题描述】:

boost::timed_lock

void wait(int seconds) 
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

boost::timed_mutex mutex; 

void thread() 
{ 
  for (int i = 0; i < 5; ++i) 
  { 
    wait(1); 
    boost::unique_lock<boost::timed_mutex> lock(mutex, boost::try_to_lock); 
    if (!lock.owns_lock()) 
      lock.timed_lock(boost::get_system_time() + boost::posix_time::seconds(1));//<<<<
    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
    boost::timed_mutex *m = lock.release(); 
    m->unlock(); 
  } 
}

timed_lock

问题>我无法理解以下几行:

  if (!lock.owns_lock()) 
     lock.timed_lock(boost::get_system_time() + 
                     boost::posix_time::seconds(1));//<<<<

这是我的理解。假设 lock.owns_lock() 返回 false,这意味着当前对象不拥有可锁定对象上的锁。所以下一行将被执行。如果在指定的时间过去后,对象仍然无法获得锁,那么boost::timed_lock 将返回 false。所以下面一行会被执行???

std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 

这个想法正确吗?我认为代码的目的是确保在对象有锁的情况下执行上述行。但是根据我的理解(我猜是不正确的),上面的行总是会运行!

问题出在哪里?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    您是对的,该示例并不能保证在执行受保护的代码之前始终正确获取锁。

    给出例子下面的解释:

    上述程序将 boost::try_to_lock 作为第二个参数传递给 boost::unique_lock 的构造函数。之后可以通过 owns_lock() 方法检查是否已获取互斥锁。如果它没有 - owns_lock() 返回 false - 使用 boost::unique_lock 提供的另一个函数:timed_lock() 等待一定时间来获取互斥锁。给定程序最多等待一秒钟,这应该足以获取互斥锁。

    这个例子实际上展示了获取互斥锁的三种基本方式:lock() 等待,直到获得互斥锁。 try_lock() 不等待,但如果互斥锁在调用时可用,则获取互斥锁,否则返回 false。最后,timed_lock() 尝试在给定的时间段内获取互斥锁。与 try_lock() 一样,成功或失败由 bool 类型的返回值指示。

    作者似乎意识到了这个问题(鉴于该文档的返回值为 timed_lock),但不认为需要重新测试是否已获得锁(正如他们所说的“等待最多一秒钟应该足够多的时间来获取互斥锁”)。


    你理解的一个错误:

    如果在指定的时间过去后,对象仍然无法获得锁,则 boost::timed_lock 将返回 false。

    这不是真的。 timed_lock 将“不断”尝试获取锁,但如果指定时间已过则放弃。

    【讨论】:

      【解决方案2】:

      你是对的。该示例没有正确处理互斥锁无法锁定的状态。如果您仔细阅读该示例下方的内容,您会看到此处引用的内容:

      上面的例子使用各种方法来说明 boost::unique_lock 提供的一些特性。当然,这些功能的使用对于给定的场景不一定有意义;前面例子中 boost::lock_guard 的使用已经足够了。这个例子是为了展示 boost::unique_lock 提供的可能性。

      【讨论】:

      • 我读过那行。我最初的理解是,这里使用 unique_lock 是为了达到目的。不过,我认为代码不正确,如果在一段时间后仍然无法获得锁,至少应该提供处理,而不是直接运行以下行。
      猜你喜欢
      • 2011-10-07
      • 2013-12-05
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多