我有可以在不同模式下打开的对象,其中包括读写。 如果你打开它,你仍然可以打电话
object->upgradeOpen();
我们的代码中通常会调用
object->downgradeOpen();
写完后。
我通常发现使用我在c ++ essentials中学到的互斥锁的概念更容易,你可以在这个互斥对象的构造函数和析构函数中完成upgradeOpen和downgradeOpen。
class ObjectMutex{
public:
ObjectMutex(const Object& o)
: m_o(o)
{
m_o.upgradeOpen();
}
~ObjectMutex(){
m_o.downgradeOpen();
}
private:
Object m_o;
};
唯一的问题是,它并没有真正锁定对象以使其线程安全,所以我不认为它确实是一个互斥体。 是否有另一个被接受的名称来称呼这种结构?
答案 0 :(得分:4)
此课程中实施的原则称为RAII(http://en.cppreference.com/w/cpp/language/raii)。
一般来说,这样的对象可以被称为" RAII对象"。
对于代码中的名称,您可以使用ScopedSomething
。在这种特殊情况下,例如,ScopedObjectUpgrader
或为范围完成的另一个有意义的行动名称。
答案 1 :(得分:1)
听起来更像是upgradable mutex
查看RAII包装器以获取可升级的互斥锁How to unlock boost::upgrade_to_unique_lock (made from boost::shared_mutex)?,以便更好地了解如何自行编写。
例如,您可能想要编写两个单独的RAII包装器
class OpenLock {
public:
OpenLock(Object& o_in) : o{o_in} {
this->o.open();
}
~OpenLock() {
this->o.close();
}
private:
Object& o;
};
class UpgradeOpenLock {
public:
UpgradeOpenLock(Object& o_in) : o{o_in} {
this->o->upgradeOpen();
}
~UpgradeOpenLock() {
this->o->downgradeOpen();
}
private:
Object& o;
};
然后像这样使用它
{
OpenLock open_lck(o);
// freely read
{
UpgradeOpenLock upgrade_lck(o);
// freely read or write
}
// freely read again
}