2017-06-21 70 views
2

我有可以在不同模式下打开的对象,其中包括读写。 如果你打开了它念你仍然可以调用这应该称为互斥锁吗?

object->upgradeOpen(); 

常见的做法是在我们的代码调用

​​

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

class ObjectMutex{ 
public: 
    ObjectMutex(const Object& o) 
     : m_o(o) 
    { 
     m_o.upgradeOpen(); 
    } 

    ~ObjectMutex(){ 
     m_o.downgradeOpen(); 
    } 
private: 
    Object m_o; 
}; 

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

回答

4

在这个类中实现的原理称为RAII(http://en.cppreference.com/w/cpp/language/raii)。

通常这样的对象可以被称为“RAII对象”。

对于代码中的名称,您可以使用ScopedSomething。在这种情况下,例如,ScopedObjectUpgrader或为范围完成的另一个有意义的动作名称。

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 
} 
+0

原理听起来很正确的,但我可以用它来实现我的代码? – turoni

+0

@turoni是的!看看链接的问题,了解如何在可升级的互斥体周围构建RAII封装的示例 – Curious

+0

您可以添加一个代码示例,因为我没有看到如何使用它比使用我写的简单类更容易。 – turoni