【发布时间】:2017-06-14 21:02:50
【问题描述】:
我正在使用 C++ 多线程程序,该程序必须使用 boost shared_mutex 在类中读取和写入一些属性。该程序在执行时会创建一个类 A 的多个对象实例。此类 A 有一个静态 shared_mutex ,由所有 A 类对象共享。如果该类的属性之一需要写入其中一个对象实例,则特定对象实例需要通过将共享互斥锁升级为唯一锁来获得对共享互斥锁的独占访问权。但是,在此之前,set 方法会检查类实例是否拥有锁,这对我来说有点奇怪。
这或多或少是 A 类 hpp 文件的样子:
#include <boost/thread.hpp>
class A{
private:
//Private methods
void setAttribute(boost::upgrade_lock<boost::shared_mutex>& lock, const bool value);
//Private variables
static boost::shared_mutex mainMutex;
mutable bool attribute;
public:
//... Some public methods using setAttribute
}
这就是 A 类 cpp 文件的样子:
void A::setAttribute(boost::upgrade_lock<boost::shared_mutex>& lock, const bool value)
{
(void)lock;
assert(lock.owns_lock());
//get exclusive access to the lock
const boost::upgrade_to_unique_lock<boost::shared_mutex> ulock(lock);
attribute = value;
}
所以,我的问题是为什么我需要检查传递的锁是否拥有锁,因为 setAttribute 方法是私有的并且它只被类中的方法使用。在任何情况下我应该考虑这样做吗?
【问题讨论】:
-
(void)lock;那是什么? -
从我看到的关于如何使用 shared_mutex 的示例中,他们总是调用 lock() 然后升级到唯一锁以获得独占访问。因此,'(void) lock' 似乎调用了一个重载运算符,该运算符为 upgrade_lock 调用 lock() 函数?但是,我不能 100% 确定这一点,因为我无法通过我迄今为止所做的研究来证实这一点
-
“从我见过的例子” - 链接?
-
这是我看到的关于如何使用 shared_mutex 的示例之一:link。当一个线程尝试写入时,它们首先创建一个以共享互斥锁作为输入的 upgrade_lock,然后使用 upgrade_to_unique_lock 获得独占访问。这里 upgrade_lock 作为参考传递,所以我想也许
(void) lock正在做实例化或一些副作用,它需要获得可升级的访问权限 -
然后发个链接!!!
标签: c++ multithreading boost