為併發設計資料結構是為了多個執行緒可以同時更好的使用此結構
設計併發資料結構的準則是什麼
保證黨資料結構不變性被別的執行緒破壞時的狀態不被任何別的執行緒看到。——意味著當要在併發中修改此結構中的部分資料時(即資料結構的不變性被破壞),應當通過新增互斥元的方法阻止其他訪問該資料的執行緒訪問(破壞的狀態不被別的執行緒看到)。
注意避免資料結構介面所固有的競爭現象,通過完整操作提供函式,而不是提供操作步驟。——在併發資料結構中使用某個操作的時候,應當注意由於資料的競爭性的原因,應當採用通過某個函式內部使用互斥元和操作的方式返回所要達到的目標,將其作為乙個完成的整體來設計。
注意當出現例外時,資料結構時怎麼來保證不變性不被破壞的。——在併發訪問資料結構時,如何才能做到保證資料結構內的資料不變性不被破壞。
當使用資料結構時,通過限制鎖的範圍和避免使用巢狀鎖,來降低產生死鎖的機會。——由於在設計併發訪問的資料結構中難免要新增互斥元,這種情況下,應該注意使用互斥元的範圍(避免因為適用範圍不當造成多執行緒併發效率低下(長時間霸佔鎖),或者造成資料還未達到想要操作的要求就釋放的危險(鎖定時間不夠))。
在設計併發資料結構時最主要的地方是應當注意到互斥元的使用位置。
6.2.1 使用鎖的執行緒安全棧
最簡單的方法就是在原始棧的每個函式內部開頭新增乙個互斥元,可以達到安全併發訪問此資料結構的目的,但是這種情況下效率較低。
#include #include #include #include using namespace std;templateclass safe_stack
safe_stack(int n, t value)
safe_stack(safe_stack& other)
safe_stack& operator=( safe_stack &other) = delete;
void push(t v)
t pop()
bool empty()
};
6.2.2 使用鎖和條件變數的執行緒安全佇列
6.2.3 使用細粒度鎖和條件變數的執行緒安全佇列
1.通過分離資料允許併發
在鍊錶的表頭和表尾分別進行操作的時候可以用倆個互斥元來操作,這樣可以提公升併發的速率。
2.等待乙個資料項pop6.3.1 編寫乙個使用鎖的執行緒安全查詢表
6.3.2 編寫乙個使用鎖的執行緒安全鍊錶
//相關**有時間再補
併發程式設計 6 基於鎖的併發資料結構設計
主要內容 如果一種資料結構可以被多個執行緒所訪問,其要不就是絕對不變的 其值不會發生變化,並且不需同步 要不程式就要對資料結構進行正確的設計,以確保其能在多執行緒環境下能夠 正確的 同步。一種選擇是使用獨立的互斥量,其可以鎖住需要保護的資料,另一種選擇是設計一種能夠併發訪問的資料結構。第一種使用互斥...
基於鎖的併發資料結構
可以使用細粒度的鎖來減小佇列的臨界區,這裡使用了乙個dummy node用來進一步減小鎖的臨界區。若要判斷佇列是否為空,只需要執行下述判斷 head.get get tail 請注意,因為在進行push的時候需要修改tail,所以對tail的訪問和修改都需要進行加鎖。這裡使用get tail來封裝這...
c 併發程式設計(六) 基於鎖的併發資料結構設計
在我們進行併發程式設計的時候,如果多執行緒使用到了資料結構,那麼程式設計過程中需要保證此資料結構的正確同步。有兩種方法 1 選擇單獨的互斥元與外部鎖來保護資料 2 設計乙個可以同時訪問的資料結構 其中前幾節我們涉及到了第一種方法,現在我們重點描述下第二種方法。使用鎖和條件變數的執行緒安全佇列 tem...