根据Boost文档boost::mutex
和boost::timed_mutex
应该是不同的。第一个实现Lockable Concept
,第二个实现TimedLockable Concept
。
但是如果你看看源代码,你会发现它们基本上是一回事。唯一的区别是锁定typedef。您可以在timed_lock
上致电boost::mutex
或暂时使用boost::unique_lock
。
typedef ::boost::detail::basic_timed_mutex underlying_mutex;
class mutex:
public ::boost::detail::underlying_mutex
class timed_mutex:
public ::boost::detail::basic_timed_mutex
背后的理由是什么?它是过去的遗留物,使用boost::mutex
作为TimedLockable
是错误的吗?毕竟它没有文件记录。
答案 0 :(得分:3)
我没有查看源代码,但几天前我使用过它们,定时的互斥锁功能不同。它们会阻塞,直到时间结束,然后返回。一个独特的锁将阻塞,直到它可以获得锁定。
尝试锁定不会阻止,然后您可以测试它是否拥有锁定的所有权。定时锁将在指定的时间内阻塞,然后表现为尝试锁定 - 即停止阻塞,并且您可以测试锁的所有权。
我相信内部的一些不同的升级锁是独特锁的typedef,因为它们都使用独特的锁定。 typedef名称在那里,以便您可以跟踪您使用不同的名称,即使您可以使用不同的功能并混淆您的客户端代码。
编辑:这是一个定时锁的示例:
boost::timed_mutex timedMutexObj;
boost::mutex::scoped_lock scopedLockObj(timedMutexObj, boost::get_system_time() + boost::posix_time::seconds(60));
if(scopedLockObj.owns_lock()) {
// proceed
}
再次修改:提供问题的具体答案,是的,将boost::mutex
用作TimedLockable
是错误的,因为boost::timed_mutex
是为此目的而提供的。如果它们在源代码中是相同的并且没有记录,那么这是不可靠的行为,您应该遵循文档。 (我的代码示例最初没有使用timed_mutex
,但我更新了它)