c 併發程式設計(六) 基於鎖的併發資料結構設計

2021-09-11 05:12:40 字數 669 閱讀 2996

在我們進行併發程式設計的時候,如果多執行緒使用到了資料結構,那麼程式設計過程中需要保證此資料結構的正確同步。有兩種方法:

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來封裝這...