2014-03-18 103 views
5

這似乎是一個令人難以置信的簡單的問題,但在我所有的研究,我一直沒能找到一個很好的例子......C++線程安全的對象

我試圖建立一個自定義類使用getter和setter函數可訪問私有變量。這個類將在全局範圍(extern)中實例化一次,並將在我的應用程序中充當數據緩存。它將被許多線程同時使用,99%用於讀取,並且速度非常重要。有什麼辦法允許併發讀取並鎖定寫入? (我假設沒有)

我是否簡單地包含一個作用域互斥體作爲getter和setter的第一行?或者如何設計這個看似簡單的對象的最佳方式?任何例子或鏈接將不勝感激(我很難包圍我的頭)。

我確實有Boost編譯進來,所以它是可用的。

我真的很感激它!

+2

這不過是一件簡單的事。每一個細節都很重要。不幸的是,你的描述只有那些珍貴的東西。 –

+0

您可以使用['std :: mutex'](http://en.cppreference.com/w/cpp/thread/mutex)或類似的同步機制來保護訪問類成員,但也許可以使用'const' getter方法,異步鎖變量需要聲明爲「可變」。 –

回答

8

假設你的封裝是正確的,getter和setter上的鎖應該是足夠的。

爲了提供併發讀取,請查看Readers-Writer鎖,它可以提供您所需的同步級別。我認爲boost::shared_mutex符合法案。

由於這是一個緩存,所以如果您能夠容忍過時的值,那麼就性能而言,您可能需要調查RCU或Read-copy-update。用戶空間RCU至少有one library

+0

shared_mutex正是我正在尋找的 - 謝謝!我結束了一個非常類似於以下的解決方案:http://stackoverflow.com/a/6450576/455215 – Harry