的boost :: unique_lock :: timed_lock的用法(Usage of bo

2019-07-17 22:54发布

提高:: 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()返回假,这意味着当前的对象不拥有可锁定对象的锁。 因此,下一行会被执行。 如果在指定的时间和失效后的对象仍然无法获得锁,那么boost::timed_lock将返回false。 所以下面的线将被执行???

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

这种想法正确吗? 我想代码的目的是确保执行上述线路当且仅当对象具有锁。 但根据我的理解(我猜是不正确的),上面的线总是被运行!

问题出在哪儿?

Answer 1:

你是正确的,该示例不保证该锁始终正确执行受保护的代码之前获得的。

考虑到下面的例子说明:

上述程序传递升压:: try_to_lock作为第二个参数,以升压:: unique_lock的构造函数。 是否互斥已经获取可以通过owns_lock()方法之后进行检查。 如果它没有 - owns_lock()返回false - 通过的boost :: unique_lock提供的另一个功能是:timed_lock()等待一定的时间来获得互斥体。 给定的程序等待长达一秒这应该是足够的时间来获取互斥体更多。

这个例子实际上显示获取互斥的三个基本途径:锁()等待,直到互斥体已经被收购。 try_lock()不等待,但获得的互斥体,如果它是在呼叫的时间,否则,返回假。 最后,timed_lock()尝试在给定时间周期内获取该互斥。 正如try_lock(),成功或失败通过bool类型的返回值指示。

作者似乎意识到了这个问题(假设的返回值的文件timed_lock ),但没想到再测试,如果已经获得锁需要(他们说这表现“等待最大一秒钟的应该是足够多的时间来获取互斥体“)。


在您的理解的一个错误:

如果在指定的时间和失效对象后仍然无法获得锁,然后升压:: timed_lock将返回false。

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



Answer 2:

你是对的。 这个例子不能正确处理当互斥锁定失败的状态。 如果你只是下面的例子仔细阅读你会看到这个报价有:

上面的例子中使用了各种方法来说明一些由升压:: unique_lock提供的功能。 当然,这些功能的使用不一定能在给定的情景意识; 升压的使用::在前面的例子lock_guard已经足够。 这个例子是相当为了演示用的boost :: unique_lock提供的可能性。



文章来源: Usage of boost::unique_lock::timed_lock
标签: c++ boost