这应该被称为互斥锁吗?

Should this be called a mutex?

本文关键字:被称为      更新时间:2023-10-16

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

object->upgradeOpen();

在我们的代码中,调用

object->downgradeOpen();

当你写完了。
我通常发现使用我在 c++ 要点中学到的互斥锁概念更容易,您可以在此互斥对象的构造函数和析构函数中完成此升级打开和降级打开。

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
}