2執行緒同步 C 11中的互斥鎖

2021-07-24 15:27:29 字數 2163 閱讀 4477

c11中mutex標頭檔案內容

mutex

類,基本的互斥鎖

recursive_mutex

類, 同一執行緒可以遞迴呼叫的互斥鎖

timed_mutex

類,在指定的時間內能返回的鎖

recursive_timed_mutex

類,在指定的時間內能返回且同一執行緒能遞迴呼叫的鎖

adopt_lock_t

空結構體,用於控制unique_lock,lock_guard的處理策略(假定當前執行緒已經獲得互斥物件的所有權,所以不再請求鎖。)

例如:std::unique_locklck(mt, std:: adopt_lock);

defer_lock_t

空結構體,用於控制unique_lock 的處理策略(不請求鎖)

try_to_lock_t

空結構體,用於控制unique_lock 的處理策略(嘗試請求鎖,但不阻塞執行緒,鎖不可用時也會立即返回。)

lock_guard

建構函式自動加鎖,析構函式自動釋放鎖。

unique_lock

具備lock_guard的功能外,增加增加了解鎖,加鎖等功能。等於是更小粒度的資源控制。

swap

交換兩個互斥鎖

try_lock

嘗試同時鎖多個物件。

lock

同時鎖住多個鎖物件。

once_flag

結構體用於儲存函式呼叫記錄標誌。

call_once

保證函式只被呼叫一次,用once_flag當作記錄看是否已經被呼叫。

c11中的鎖在linux 平台上的實現

就是對pthread_mutex物件的封裝,具備了pthread_mutex的所有特性。

c11中的鎖在win 平台上的實現

是對臨界區的封裝嗎? 答案是否定的。

通過對鎖函式上鎖的跟蹤發現如下**:

bool

critical_section::_acquire_lock(

void

* _plockingnode,

bool

_fha***ternalnode)

lockqueuenode * pprevious =reinterpret_cast

(interlockedexchangepointer(&_m_ptail, pnewnode));

// 通過原子操作對指標進行判斷,看是否已經上鎖,

null

表示未上鎖 if

(pprevious == null)

else }

if(_fha***ternalnode)

return

pnewnode->m_trigger != triggeredbytimeout; }

我們繼續跟蹤競爭鎖的**

void

block(

unsigned

intcurrentticketstate =0) }

}//如果自旋完成後,依然得不到鎖,本執行緒進入這個函式後,陷入核心態開始睡眠

m_pcontext->block();

}睡眠函式如下:

void

externalcontextbase::block()

else }

呼叫waitforsingleobjectex

函式而進入核心態。

總結

c11鎖的原理就是先自旋,不能成功後,執行waitforsingleobjectex

函式後進入核心態睡眠。

通過跟蹤

windos

提供的臨界區**,發現也有原子操作,進入核心態睡眠。在作業系統提供的功能下,兩種方法是同級的,來自於不同產品的包裝而已。

C 11 多執行緒同步 互斥鎖 條件變數

在多執行緒程式中,執行緒同步 多個執行緒訪問乙個資源保證順序 是乙個非常重要的問題,linux下常見的執行緒同步的方法有下面幾種 這篇部落格只介紹互斥量和條件變數的使用。通常情況下,互斥鎖和條件變數是配合使用的,互斥鎖用於短期鎖定,主要保證執行緒對臨界區的進入 條件變數用於執行緒長期等待,在wait...

c 多執行緒鎖(c 11)

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

C 11多執行緒使用互斥變數

在學習作業系統的時候,有學過互斥變數,也就是用來保護原子數在同一時刻只能被乙個執行緒進行訪問和修改。c 中通過例項化 std mutex 建立互斥量,通過呼叫成員函式lock 進行上鎖,unlock 進行解鎖。不過,不推薦實踐中直接去呼叫成員函式,因為呼叫成員函式就意味著,必須記住在每個函式出口都要...