gpt4 book ai didi

c++ - 如何正确使用 boost::timed_mutex 和 scoped_lock

转载 作者:行者123 更新时间:2023-11-28 02:46:59 27 4
gpt4 key购买 nike

我正在尝试同时使用 timed_mutex 和 scoped_lock。我之前通过一些示例成功地使用了 scoped_lock,但现在我似乎找不到解决方法,我也无法正确理解 boost 文档。

期望的行为如下:尝试获取 scoped_lock x 时间,如果成功则返回 true,否则返回 false。

目前我有:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

但是,当我尝试查找(通过 boost 文档或示例)此 scoped_lock 是否会返回 bool 值时,我什么也没找到,或者找到了完全不同的方法来执行此操作。

因此我想知道哪种方法是正确的,它究竟是如何工作的,也许还有一些关于如何正确“阅读”boost 文档的指示。

更新:

所以

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

if(scoped_lock.owns_lock()) {
// exclusive code
}

将创建一个互斥锁,当我尝试使用 scoped_lock.owns_lock() 锁定时,它将尝试在 10 毫秒(在本例中)内获取锁,如果时间到了但未获取锁,则返回 false?

最佳答案

如果您查看 documentation , boost::timed_mutex::scoped_lock只是 boost::unique_lock<timed_mutex> 的别名:

class timed_mutex:
boost::noncopyable
{
public:
// ...

typedef unique_lock<timed_mutex> scoped_timed_lock;
typedef unspecified-type scoped_try_lock;
typedef scoped_timed_lock scoped_lock;

// ...
};

现在查看 documentation对于 boost::unique_lock , 表明有两种方法可以判断你是否拥有这把锁:

template<typename Lockable>
class unique_lock
{
public:
// ...

explicit operator bool() const noexcept;
bool owns_lock() const noexcept;

// ...
};

因此,你可以做任何一个

if(scoped_lock) {
// we have the lock, yay!
}

if(scoped_lock.owns_lock()) {
// we have the lock, yay!
}

顺便说一句,unique_lock 有一个构造函数将相对时间作为 chrono::duration,这可能比使用绝对时间更干净也可能不干净。

编辑:鉴于此代码:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex,
boost::get_system_time() + boost::posix_time::miliseconds(10)); // <-- attempt to acquire mutex happens here!

if(scoped_lock.owns_lock()) {
// exclusive code
}

获取互斥量的尝试发生在构造锁时,而不是 owns_lock() 时叫做。是的,独占代码只有在您成功获取互斥量时才会执行。我不确定你所说的“返回错误”是什么意思——这段代码不返回任何东西。如果owns_lock()返回 false,则说明您无法获取互斥量并且无法运行独占代码,并且您可以随时将其传达给调用者。

关于c++ - 如何正确使用 boost::timed_mutex 和 scoped_lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24096263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com