互斥鎖用於控制多個執行緒對共享資源互斥訪問的乙個訊號量。可以避免多個執行緒再某一時刻同時操作乙個共享資源。
在某一時刻,只能有乙個執行緒可以獲取互斥鎖,在釋放互斥鎖之前其他執行緒都不能獲取該互斥鎖。如果其他執行緒想要獲取這個互斥鎖,則執行緒只能以阻塞方式進行等待。
互斥鎖是是一種sleep-waiting的鎖。假設執行緒t1獲取互斥鎖並且正在core1上執行時,此時執行緒t2也想要獲取互斥鎖(pthread_mutex_lock),但是由於t1正在使用互斥鎖使得t2被阻塞。當t2處於阻塞狀態時,t2被放入到等待佇列中去,處理器core2會去處理其他任務而不必一直等待(忙等)。也就是說處理器不會因為執行緒阻塞而空閒著,它去處理其他事務去了。
標頭檔案:
型別:std::mutex
用法:構建std::mutex的例項來建立互斥元,呼叫成員函式lock()和unlock()來解鎖。
例子:
#include#includestd::listsome_list;
std::mutex some_mutex;
void add_to_list(int new_value)
條件鎖就是條件變數,某乙個執行緒因為某個條件為滿足時可以使用條件變數使改程式處於阻塞狀態。條件滿足以後,就通過訊號量的方式喚醒被該條件阻塞的執行緒。最常見的是,任務隊列為空時,執行緒池種的執行緒因為任務隊列為空這個條件而處於阻塞狀態,任務進入後,就會以訊號量的方式來喚醒乙個執行緒來處理任務。
標頭檔案:< condition_variable >
型別:std::condition_variable(只和std::mutex一起工作) 和 std::condition_variable_any(符合類似互斥元的最低標準的任何東西一起工作)。
自旋鎖是一種busy-waiting的鎖。也就是說,如果t1正在使用自旋鎖,而t2也去申請這個自旋鎖,此時t2肯定得不到這個自旋鎖。與互斥鎖相反的是,此時執行t2的處理器core2會一直不斷地迴圈檢查鎖是否可用(自旋鎖請求),直到獲取到這個自旋鎖為止。
從「自旋鎖」的名字也可以看出來,如果乙個執行緒想要獲取乙個被使用的自旋鎖,那麼它會一致占用cpu請求這個自旋鎖使得cpu不能去做其他的事情,直到獲取這個鎖為止,這就是「自旋」的含義。
當發生阻塞時,互斥鎖可以讓cpu去處理其他的任務;而自旋鎖讓cpu一直不斷迴圈請求獲取這個鎖。通過兩個含義的對比可以我們知道「自旋鎖」是比較耗費cpu的。
面試題 殭屍程序的四種處理方法
l 父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起 l 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後,父程序會收到該訊號,可以在handler中呼叫wait l 如果父程序不關心子程序什麼時候結束,那麼可以用signal ...
C 學習筆記7 C 函式的公升級 上
1 常量與巨集回顧 c 中的const常量可以替代巨集引數定義 const int a 5 等價於 define a 5 巨集具有 那麼c 是否有方法避免呢?2 內聯函式 c 中推薦使用內聯函式代替巨集 片段 c 中inline關鍵字宣告內聯函式 inline int func int a,int ...
面試題延伸 之 雜湊衝突及四種解決方法
最近看了布隆去重原理,發現乙個詞雜湊衝突特意去查了下 參考雜湊衝突的產生原因雜湊是通過對資料進行再壓縮,提高效率的一種解決方法。但由於通過雜湊函式產生的雜湊值 是有限的,而資料可能比較多,導致經過雜湊函式處理後仍然有不同的資料對應相同的雜湊值。這時候就產生了雜湊衝突。產生雜湊衝突的影響因素裝填因子 ...