執行緒基礎3

2022-02-03 16:43:56 字數 1497 閱讀 3687

mutex 又稱互斥量,c++ 11中與 mutex 相關的類(包括鎖型別)和函式都宣告在 標頭檔案中,所以如果你需要使用 std::mutex,就必須包含 標頭檔案。

mutex 系列類(四種)

lock 類(兩種)

其他型別

函式下面以 std::mutex 為例介紹 c++11 中的互斥量用法。

std::mutex 是c++11 中最基本的互斥量,std::mutex 物件提供了獨佔所有權的特性——即不支援遞迴地對 std::mutex 物件上鎖,而 std::recursive_lock 則可以遞迴地對互斥量物件上鎖。

std::mutex 的成員函式std::recursive_mutex 與 std::mutex 一樣,也是一種可以被上鎖的物件,但是和 std::mutex 不同的是,std::recursive_mutex 允許同乙個執行緒對互斥量多次上鎖(即遞迴上鎖),來獲得對互斥量物件的多層所有權,std::recursive_mutex 釋放互斥量時需要呼叫與該鎖層次深度相同次數的 unlock(),可理解為 lock() 次數和 unlock() 次數相同,除此之外,std::recursive_mutex 的特性和 std::mutex 大致相同。

std::time_mutex 比 std::mutex 多了兩個成員函式,try_lock_for(),try_lock_until()。

try_lock_for 函式接受乙個時間範圍,表示在這一段時間範圍之內執行緒如果沒有獲得鎖則被阻塞住(與 std::mutex 的 try_lock() 不同,try_lock 如果被呼叫時沒有獲得鎖則直接返回 false),如果在此期間其他執行緒釋放了鎖,則該執行緒可以獲得對互斥量的鎖,如果超時(即在指定時間內還是沒有獲得鎖),則返回 false。

try_lock_until 函式則接受乙個時間點作為引數,在指定時間點未到來之前執行緒如果沒有獲得鎖則被阻塞住,如果在此期間其他執行緒釋放了鎖,則該執行緒可以獲得對互斥量的鎖,如果超時(即在指定時間內還是沒有獲得鎖),則返回 false。

std::timed_mutex mtx;

mtx.try_lock_for(std::chrono::milliseconds(

200)) // 在200ms內嘗試獲得鎖,沒有獲得,就返回false

自動上鎖解鎖:lock_guard  , unique_lock

#include //

std::cout

#include //

std::thread

#include //

std::mutex, std::lock_guard

#include //

std::logic_error

std::mutex mtx;

void print_even(int

x) void print_thread_id(int

id)

catch (std::logic_error&)

}int

main()

執行緒基礎3 執行緒中斷

已經過時的方法 暫停 suspend 恢復 resume 停止 stop 過時原因 suspend 方法在呼叫後,執行緒不會釋放已經占有的資源 比如鎖 而是占有著資源進入睡眠狀態,這樣容易引發死鎖問題。stop 方法在終結乙個執行緒時不會保證執行緒的資源正常釋放。執行緒中斷的三個方法 注意 執行緒在...

執行緒基礎學習3

執行緒的狀態 等待和喚醒的機制 在多個執行緒之間通過等待方法和喚醒方法進行通訊,沒有被喚醒的話就一直等待。package threadtest void wait 導致當前執行緒等待,直到另乙個執行緒呼叫該物件的 notify 方法或notifyall 方法。void wait long timeo...

執行緒3 執行緒安全

public class resource else x x x 2 class getimplements runnable public static void main string args 1.多個執行緒 2.修改公共的資源,變數 3.多行 非原子性操作 1.synchronized 2....