【发布时间】:2016-01-29 15:15:33
【问题描述】:
我们一直在项目中使用 Boost 的 basic_lockable_adapter 和 strict_lock 进行线程同步。我们已经确定了一种可能导致死锁的情况,并且我们希望避免这种情况。如果我们能够检测到basic_lockable_adapter 是否被锁定,我们可以断言它并在开发过程中捕获它。
这是我正在寻找的示例(此代码是可编译的,除了一个函数不存在这一事实):
#include <boost/thread/lockable_adapter.hpp>
#include <boost/thread/strict_lock.hpp>
#include <mutex>
class Controller : public boost::basic_lockable_adapter<std::recursive_mutex>
{
public:
static Controller& instance() { static Controller instance; return instance; }
};
void check_for_lock()
{
// is_locked() isn't real ... but I'd like that functionality somehow
if (Controller::instance().is_locked())
std::cout << "It's locked." << std::endl;
else
std::cout << "Not locked." << std::endl;
}
int main()
{
check_for_lock();
boost::strict_lock<Controller> lock(Controller::instance());
check_for_lock();
return 0;
}
是否可以实现.is_locked()的等价物?
编辑 - 澄清
我忘了提一个重点。我们使用 Boost 文档中解释的“外部锁定”范例。这样,一个绝对需要持有锁的函数只需要一个引用作为参数——因此,如果你得到这个参数,你就知道你有锁。
在我的情况下,情况正好相反。我想知道当前线程当前是否有锁,来自一个不期望strict_lock作为参数的函数,所以我可以断言或抛出。
所以:该函数知道lockable_adapter 是什么,但需要知道当前执行的线程是否有那个锁(它不关心其他线程)。
【问题讨论】: