繁体   English   中英

应该将其称为互斥体吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM