这应该被称为互斥体吗?

时间:2017-06-21 08:54:05

标签: c++ mutex

我有可以在不同模式下打开的对象,其中包括读写。 如果你打开它,你仍然可以打电话

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;
};

唯一的问题是,它并没有真正锁定对象以使其线程安全,所以我不认为它确实是一个互斥体。 是否有另一个被接受的名称来称呼这种结构?

2 个答案:

答案 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
}