2017-06-21 58 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