c 11 執行緒支援庫 通用互斥管理

2021-08-25 08:46:57 字數 3420 閱讀 4135

template< class mutex >

class lock_guard;

lock_guard是互斥封裝器,為在作用域塊期間占有互斥提供便利 raii 風格機制。

建立lock_guard物件時,它試圖接收給定互斥的所有權。控制離開建立lock_guard物件的作用域時,銷毀lock_guard並釋放互斥。

lock_guard類不可複製。

#include #include #include int g_i = 0;

std::mutex g_i_mutex; // 保護 g_i

void safe_increment()

int main()

//可能輸出:

main:0

11452:1

12504:2

main:2

類 unique_lock 是通用互斥包裝器,允許延遲鎖定、鎖定的有時限嘗試、遞迴鎖定、所有權轉移和與條件變數一同使用。

類 unique_lock 可移動,但不可複製——它滿足可移動構造 (moveconstructible) 和可移動賦值 (moveassignable) 但不滿足可複製構造 (copyconstructible) 或可複製賦值 (copyassignable) 。

類 unique_lock 滿足基礎可鎖 (basiclockable) 要求。若mutex滿足可鎖 (lockable) 要求,則 unique_lock 亦滿足可鎖(lockable) 要求(例如:能用於 std::lock ) ;若mutex滿足定時可鎖 (timedlockable) 要求,則 unique_lock 亦滿足定時可鎖 (timedlockable) 要求。

//鎖定關聯互斥 。 等效地呼叫mutex()->lock()

#include #include #include #include #include /*下列示例用 lock 重獲得被解鎖的互斥。*/

int main();

for (int i = 0; i < 10; ++i) threads.emplace_back(worker_task, i);

for (auto &thread : threads) thread.join();

}//可能輸出:

0, initial counter: 1

1, initial counter: 2

2, initial counter: 3

3, initial counter: 4

4, initial counter: 5

5, initial counter: 6

6, initial counter: 7

7, initial counter: 8

8, initial counter: 9

9, initial counter: 10

6, final counter: 11

3, final counter: 12

4, final counter: 13

2, final counter: 14

5, final counter: 15

0, final counter: 16

1, final counter: 17

7, final counter: 18

9, final counter: 19

8, final counter: 20

bool try_lock();

嘗試鎖定關聯互斥而不阻塞。等效地呼叫 mutex()->try_lock() 。

若無關聯互斥或關聯互斥已被此std::unique_lock鎖定則丟擲 std::system_error 。

template< class rep, class period >

bool try_lock_for( const std::chrono::duration

& timeout_duration );

嘗試鎖定關聯互斥。阻塞直至經過指定的timeout_duration或獲得鎖,之先到來者。成功獲得鎖時返回 true ,否則返回 false 。等效地呼叫 mutex()->try_lock_for(timeout_duration) 。

由於排程或資源爭議延遲,此函式可能阻塞長於timeout_duration

標準建議用穩定時鐘度量時長。若實現用系統時鐘代替,則等待時間亦可能對時鐘調節敏感。

若無關聯互斥或若此std::unique_lock已鎖定互斥則丟擲 std::system_error 。

template< class clock, class duration >

bool try_lock_until( const std::chrono::time_point

& timeout_time );

嘗試鎖定關聯互斥。阻塞直至抵達指定的timeout_time或獲得鎖,之先到來者。成功獲得鎖時返回 true ,否則返回 false 。可能阻塞長於直至抵達timeout_time

等效地呼叫 mutex()->try_lock_until(timeout_time) 。

若無關聯互斥或已鎖定互斥則丟擲 std::system_error 。

void unlock();

解鎖關聯互斥並釋放所有權。

若無關聯互斥或互斥未被鎖則丟擲 std::system_error 。

struct defer_lock_t ;

struct try_to_lock_t ;

struct adopt_lock_t ;

std::try_to_lockstd::adopt_lock分別是空結構體標籤型別 std::defer_lock_t 、 std::try_to_lock_t 和 std::adopt_lock_t 的例項。

#include #include #includestruct bank_account 

int balance;

std::mutex m;

};void transfer(bank_account &from, bank_account &to, int amount)

int main()

100:50

transfer 20 from : 80 to : 70

70 : 80

transfer 5 from : 65 to : 85

c 11 執行緒支援庫 執行緒

c 支援庫 c 包含執行緒 互斥 條件變數和 的內建支援。class thread 類thread表示單個執行執行緒。執行緒允許多個函式併發執行。緊接著關聯的執行緒物件構造,執行緒開始執行 為任何 os 排程延遲懸掛 始於作為構造函式引數提供的頂層函式。忽略頂層函式的返回值,而且若它以拋異常終止,則...

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

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

c 11多執行緒庫

建立執行緒的四種方法 執行緒類的建構函式是變參建構函式,第乙個引數是執行緒函式,後面的引數為執行緒函式的引數 引數通過值傳遞方式,若要引用傳遞須加std ref thread t1 counter,1,6 void counter int,int class counter 實現 operator ...