2015-09-06 69 views
4

讓我們用C考慮這樣一個類++:C++的set/get方法同步

class CuteClass 
{ 
public: 
    int getFancyInt() const; 
    float getNiceFloat() const; 
    string getPerfectString() const; 

    void setIntSomething(int something); 
    void setInternalState(State newState); 
}; 

這個類的實例可以同時從幾個不同的線程訪問。然後:

所有getMethods(getFancyInt,getNiceFloat,getPerfectString)不應該彼此阻塞。它們不會更改對象的內部狀態。

所有使用setMethod(setIntSomething,setInternalState)應:

  • 塊彼此 - 避免對象的不一致的狀態,
  • 塊中的所有的getMethods - 以避免返回部分改變的數據,
  • 由被阻塞所有getMethods - 避免返回部分更改的數據。

帶互斥鎖的簡單lock_guard將滿足除一個之外的所有要求 - getMethod將阻止其他getMethods。

在這種情況下,哪種解決方案容易且乾淨?

+0

可能重複/ Writer Locks in C++](http://stackoverflow.com/questions/244316/reader-writer-locks-in-c) – Amit

回答

3

std::atomic應該解決關於部分更改數據的任何問題。

[編輯:]不,它沒有。如果我不刪除這個錯誤的答案,那只是爲了應該保留有見地的評論。

+0

只有在內部基本類型的情況下,Atomic纔是有效的解決方案。 對於複雜類型或倍數類型,仍然可以有競爭條件 – adev

+2

'std :: atomic'也適用於用戶定義的類型,但可能涉及鎖定。 –

+1

這不會解決讀取時對象的內部狀態。請參閱操作點'block all getMethods - 避免返回部分更改的數據' –

6

你所追求的是一個R/W互斥體。

您將其鎖定爲所有吸氣器中的「讀取」,並將其鎖定在所有設置器中的「寫入」中。

升壓shared_mutex是你在找什麼

Example for boost shared_mutex (multiple reads/one write)?

爲了用你的「常量」聲明兼容,你需要聲明的互斥體本身[閱讀器的可變

+2

從C++ 17開始,我們也會有'std :: shared_mutex'。 –