C 11 中的幾種鎖

2021-09-26 14:15:19 字數 1301 閱讀 7536

可以避免多個執行緒在某一時刻同時操作乙個共享資源,標準c++庫提供了std::unique_lock類模板,實現了互斥鎖的raii慣用語法:

eg:

std::unique_locklk(mtx_sync_);
條件鎖就是所謂的條件變數,某乙個執行緒因為某個條件未滿足時可以使用條件變數使該程式處於阻塞狀態。一旦條件滿足了,即可喚醒該執行緒(常和互斥鎖配合使用),喚醒後,需要檢查變數,避免虛假喚醒。

eg:

執行緒1:

// wait ack

)) // wait for 1s

else

}執行緒2:

// 通知前解鎖,可以避免喚醒執行緒後由於互斥鎖的關係又進入了阻塞階段

cv_sync_.notify_one();

自旋鎖是一種基礎的同步原語,用於保障對共享資料的互斥訪問。與互斥鎖的相比,在獲取鎖失敗的時候不會使得執行緒阻塞而是一直自旋嘗試獲取鎖。當執行緒等待自旋鎖的時候,cpu不能做其他事情,而是一直處於輪詢忙等的狀態。自旋鎖主要適用於被持有時間短,執行緒不希望在重新排程上花過多時間的情況。實際上許多其他型別的鎖在底層使用了自旋鎖實現,例如多數互斥鎖在試圖獲取鎖的時候會先自旋一小段時間,然後才會休眠。如果在持鎖時間很長的場景下使用自旋鎖,則會導致cpu在這個執行緒的時間片用盡之前一直消耗在無意義的忙等上,造成計算資源的浪費。

// 使用者空間用 atomic_flag 實現自旋互斥

#include #include #include #include std::atomic_flag lock = atomic_flag_init;

void f(int n)}

int main()

for (auto& t : v)

}

recursive_mutex 類是同步原語,能用於保護共享資料免受從個多執行緒同時訪問。

recursive_mutex 提供排他性遞迴所有權語義:

執行緒占有 recursive_mutex 時,若其他所有執行緒試圖要求 recursive_mutex 的所有權,則它們將阻塞(對於呼叫 lock )或收到 false 返回值(對於呼叫 try_lock )。

可鎖定 recursive_mutex 次數的最大值是未指定的,但抵達該數後,對 lock 的呼叫將丟擲 std::system_error 而對 try_lock 的呼叫將返回 false 。

若 recursive_mutex 在仍為某執行緒占有時被銷毀,則程式行為未定義。 recursive_mutex 類滿足互斥 (mutex) 和標準布局型別 (standardlayouttype) 的所有要求。

c 11自旋鎖的實現

首先我們需要明確,自旋鎖式一種用於保護多執行緒共享資源的鎖,它在linux 核心中也有所使用.epoll 中有使用 和一般互斥鎖不同的式當自旋鎖嘗試獲取cpu的時候可以是一種忙等的狀態,自旋鎖不能主動放棄cpu 如果是核心中的自旋鎖,如果沒有及時釋放一種拿到手中,可能會導致系統掛起 我們在這裡使用c...

C 11讀寫鎖的實現

參考的原始碼 讀寫鎖,一直都有聽,也大概知道點原理,一直沒有 內部是如何實現的,正好今天完成了幾項大作業,研究一下讀寫鎖實現的原理。讀寫鎖的原理就是,可以多次讀,但是寫只能一次一次的寫入,我參考的原始碼博主控制了寫優先,並且讀的優先順序沒我寫的這麼高。我自己在修改了他的原始碼,實現的是讀優先,並且優...

c 多執行緒鎖(c 11)

mutex屬於sleep waiting型別的鎖。例如在乙個雙核的機器上有兩個執行緒 執行緒a和執行緒b 它們分別執行在core0和core1上。假設執行緒a想要通過pthread mutex lock操作去得到乙個臨界區的鎖,而此時這個鎖正被執行緒b所持有,那麼執行緒a就會被阻塞,core0會在此...