多執行緒中的互斥鎖

2021-09-27 08:49:21 字數 2297 閱讀 3097

互斥量mutex

類物件,理解成一把鎖,多個執行緒嘗試用lock()成員函式來對其加鎖,只有乙個執行緒能夠鎖定成功

lock( ) 與unlock( )須成對存在,很容易出問題, 所以引入**std::lock_guard()**類模板,對於忘記新增unlock(),會自動新增,類似於智慧型指標的功能。

鎖住的**量多少成為粒度的粗細,粒度越細,**執行效率越高。

死鎖

至少有兩個互斥量(鎖頭)才會產生死鎖。避免方法:只要保證互斥量上鎖的順序一致就不會產生死鎖。

std::.lock()處理多個互斥量才派的上用場。【謹慎使用】

adopt_lock是乙個結構體物件,起乙個標記作用:表示互斥量已經lock(),不需要在std::lock_guardmguard(m_mutex1)再次lock();

// 方法1:

m_mutex2.

lock()

;m_mutex1.

lock()

;//---------------

m_mutex2.

unlock()

;m_mutex1.

unlock()

;//-------------

m_mutex2.

lock()

;// 與前面上鎖順序一致

m_mutex1.

lock()

;//---------------

m_mutex2.

unlock()

;m_mutex1.

unlock()

;// 方法2:

std:

:lock_guard:mutex>

mguard1

(m_mutex1)

;std:

:lock_guard:mutex>

mguard2

(m_mutex2)

;//------------------------------

std:

:lock_guard:mutex>

mguard1

(m_mutex1)

;std:

:lock_guard:mutex>

mguard2

(m_mutex2)

;// 方法3:結合std::lock()和lock_guard(),使用adop_lock

std:

:lock

(m_mutex1, m_mutex2)

;std:

:lock_guard:mutex>

mguard1

(m_mutex1, std:

:adopt_lock)

;std:

:lock_guard:mutex>

mguard2

(m_mutex2, std:

:adopt_lock)

;// 後面無須再unlock();

unique_lock可以完全取代lock_guard

工作中一般使用lock_guard

unique_lock比lock_guard靈活,記憶體占用多一點

第二個引數:

std:

:unique_lock:mutex>

mguard

(m_mutex, std:

:defer_lock)

;

unique_lock的成員函式:

std::unique_lockmguard(m_mutex);

std::mutex* pt = mguard.release(); // 此時pt相當於m_mutex,解除關聯,有責任手動解鎖

//--------------------

pt->unlock();

unique_lock所有權的傳遞

std:

:unique_lock:mutex>

mguard1

(m_mutex)

;std:

:unique_lock:mutex>

mguard2

(std:

:move

(mguard1)

);

多執行緒 互斥鎖

include include include handle mutex null srwlock g lock 改變乙個變數的時候需要鎖定 int num 6400000 在讀期間,值一直在變化,沒有鎖定。dword winapi reada void p i 使用acquiresrwlocksh...

多執行緒 互斥鎖

package com.yys.thread created by yys on 2017 9 25.兩個執行緒執行 t1如果能拿到02物件則t1執行緒執行完畢 t2如果能拿到o1物件則t2執行緒執行完畢 現在兩個執行緒分別鎖定了對方需要的物件 造成執行緒死鎖 public class testde...

多執行緒 互斥鎖

使用reentrantlock類的lock和unlock方法進行同步通訊 使用reentrantlock類的newcondition方法可以獲取condition物件,需要等待的時候使用conditionde await方法,喚醒的時候用signal方法,不同的執行緒使用不同的condition,這...