在我們進行併發程式設計的時候,如果多執行緒使用到了資料結構,那麼程式設計過程中需要保證此資料結構的正確同步。有兩種方法:
1、選擇單獨的互斥元與外部鎖來保護資料
2、設計乙個可以同時訪問的資料結構
其中前幾節我們涉及到了第一種方法,現在我們重點描述下第二種方法。
使用鎖和條件變數的執行緒安全佇列
templateclass threadsafe_queue
void push(t new_value)
void wait_and_pop(t& value)
); value = std::move(data_queue.front());
data_queue.pop();
} std::shared_ptrwait_and_pop()
); std::shared_ptrres(
std::make_shared(std::move(data_queue.front())));
data_queue.pop();
return res;
} bool try_pop(t& value)
std::shared_ptrtry_pop()
bool empty() const
};
C 併發程式設計 自旋鎖
自旋鎖是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。include pch.h include include include include using namespace std class sp...
併發程式設計 6 基於鎖的併發資料結構設計
主要內容 如果一種資料結構可以被多個執行緒所訪問,其要不就是絕對不變的 其值不會發生變化,並且不需同步 要不程式就要對資料結構進行正確的設計,以確保其能在多執行緒環境下能夠 正確的 同步。一種選擇是使用獨立的互斥量,其可以鎖住需要保護的資料,另一種選擇是設計一種能夠併發訪問的資料結構。第一種使用互斥...
基於鎖的併發資料結構
可以使用細粒度的鎖來減小佇列的臨界區,這裡使用了乙個dummy node用來進一步減小鎖的臨界區。若要判斷佇列是否為空,只需要執行下述判斷 head.get get tail 請注意,因為在進行push的時候需要修改tail,所以對tail的訪問和修改都需要進行加鎖。這裡使用get tail來封裝這...