在我們的應用程序中,我們處理在工作線程中處理並在顯示線程中訪問的數據,並且我們有一個互斥體負責處理關鍵部分。沒什麼特別的。保護數據設計模式
現在我們考慮重新處理我們的代碼,當前鎖定由持有和處理數據的方明確地完成。我們想到了一個擁有數據的實體,只能以保護的方式訪問數據。
爲此,我們有一個名爲GuardedData的類。調用者可以請求這樣一個對象,並且應該在本地範圍內只保留一小段時間。只要對象存在,它就會保持鎖定狀態。一旦對象被銷燬,鎖就會被釋放。數據訪問與鎖定機制相結合,無需在調用者中進行任何明確的額外工作。班級的名字提醒現在的警衛的來電者。
template<typename T, typename Lockable>
class GuardedData {
GuardedData(T &d, Lockable &m) : data(d), guard(m) {}
boost::lock_guard<Lockable> guard;
T &data;
T &operator->() { return data; }
};
再次,一個非常簡單的概念。運算符 - >模仿STL迭代器的語義以訪問有效負載。
現在我不知道:
- 是這種方法衆所周知的?
- 是否有像這樣的模板類已經可用,例如:在boost庫中?
我在問,因爲我認爲這是一個相當通用和可用的概念。雖然我找不到像這樣的東西。
我有數據可以在後臺訪問時在前臺進行更改。有效地,當背景計算完成時,數據被交換。當有人訪問數據時,這種交換不應該發生,這可能導致該方進入不一致的狀態。我們需要做交換而不是創建一個新的實例,而其他人仍然使用舊的實例。原因是同時駐留在內存中的大量數據。 – ypnos 2013-03-21 13:59:12