多執行緒程式設計(1) 鎖的使用

2021-09-27 08:55:31 字數 1457 閱讀 8900

互斥鎖(mutexlock):

最常使用於執行緒同步的鎖;標記用來保證在任一時刻,只能有乙個執行緒訪問該物件,同一執行緒多次加鎖操作會造成死鎖;臨界區和互斥量都可用來實現此鎖,通常情況下鎖操作失敗會將該執行緒睡眠等待鎖釋放時被喚醒

自旋鎖(spinlock):

同樣用來標記只能有乙個執行緒訪問該物件,在同一執行緒多次加鎖操作會造成死鎖;使用硬體提供的swap指令或test_and_set指令實現;同互斥鎖不同的是在鎖操作需要等待的時候並不是睡眠等待喚醒,而是迴圈檢測保持者已經釋放了鎖,這樣做的好處是節省了執行緒從睡眠狀態到喚醒之間核心會產生的消耗,在加鎖時間短暫的環境下這點會提高很大效率

讀寫鎖(rwlock):

遞迴鎖(recursivelock):

嚴格上講遞迴鎖只是互斥鎖的乙個特例,同樣只能有乙個執行緒訪問該物件,但允許同乙個執行緒在未釋放其擁有的鎖時反覆對該鎖進行加鎖操作; windows下的臨界區預設是支援遞迴鎖的,而linux下的互斥量則需要設定引數pthread_mutex_recursive_np,預設則是不支援。

說明:首先我們說明互斥鎖的工作原理,互斥鎖是是一種sleep-waiting的鎖。假設執行緒t1獲取互斥鎖並且正在core1上執行時,此時執行緒t2也想要獲取互斥鎖(pthread_mutex_lock),但是由於t1正在使用互斥鎖使得t2被阻塞。當t2處於阻塞狀態時,t2被放入到等待佇列中去,處理器core2會去處理其他任務而不必一直等待(忙等)。也就是說處理器不會因為執行緒阻塞而空閒著,它去處理其他事務去了。

而自旋鎖就不同了,自旋鎖是一種busy-waiting的鎖。也就是說,如果t1正在使用自旋鎖,而t2也去申請這個自旋鎖,此時t2肯定得不到這個自旋鎖。與互斥鎖相反的是,此時執行t2的處理器core2會一直不斷地迴圈檢查鎖是否可用(自旋鎖請求),直到獲取到這個自旋鎖為止。

來看一下示例**:

以下工程由vs2015建立:

#include // std::cout

#include // std::thread

#include // std::mutex, std::unique_lock

#include // std::condition_variable

std::mutex g_mutexlock; // 全域性互斥鎖.

std::condition_variable g_conditionvari; // 全域性條件變數.

void do_print_id(int id)

void wakeup()

int main()

std::cout << "all the thread is over" << std::endl;

return 0;

}

多執行緒程式設計 互斥鎖

多執行緒程式設計 互斥鎖 1 引言 互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 1 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...

python多執行緒程式設計 使用互斥鎖同步執行緒

假設乙個例子 有乙個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的 encoding utf 8 import threading import time class mythread threading.thread defrun s...

python多執行緒程式設計 使用互斥鎖同步執行緒

usr bin env python coding utf 8 import time,threading 假定這是你的銀行存款 balance 0 muxlock threading.lock defchange it n 先存後取,結果應該為0 global balance balance ba...