![](/img/trans.png)
[英]How to disable mutex if called within another function locking same mutex
[英]Should this be called a mutex?
我有可以在不同模式下打开的对象,其中包括读写模式。 如果您打开阅读,您仍然可以拨打电话
object->upgradeOpen();
在我们的代码中,通常的做法是
object->downgradeOpen();
完成写作后。
我通常发现更容易使用在c ++要素中学到的互斥锁的概念,在该互斥锁的概念中,您可以在此互斥对象的构造函数和析构函数中完成upgradeOpen和downgradeOpen的操作。
class ObjectMutex{
public:
ObjectMutex(const Object& o)
: m_o(o)
{
m_o.upgradeOpen();
}
~ObjectMutex(){
m_o.downgradeOpen();
}
private:
Object m_o;
};
唯一的问题是,它并没有真正锁定对象以使其线程安全,因此我认为它实际上不是互斥体。 是否有另一个可接受的名称来称呼这种结构?
在此类中实现的原理称为RAII( http://en.cppreference.com/w/cpp/language/raii )。
通常,这样的对象可以称为“ RAII对象”。
对于代码中的名称,可以使用ScopedSomething
。 在这种特殊情况下,例如, ScopedObjectUpgrader
或为作用域完成的另一个有意义的操作名称。
在我看来更像是可升级的互斥锁
看一下可升级互斥的RAII包装器。 如何解锁boost :: upgrade_to_unique_lock(由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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.