C++ 互斥
mutex
mutex 類是能用于保護共享數據免受從多個線程同時訪問的同步原語。
mutex 提供排他性非遞歸所有權語義:
- 調用方線程從它成功調用 lock 或 try_lock 開始,到它調用 unlock 為止占有 mutex 。
- 線程占有 mutex 時,所有其他線程若試圖要求 mutex 的所有權,則將阻塞(對于 lock 的調用)或收到 false 返回值(對于 try_lock )。
- 調用方線程在調用 lock 或 try_lock 前必須不占有 mutex 。
- 若 mutex 在仍為任何線程所占有時即被銷毀,或在占有 mutex 時線程終止,則行為未定義。
- mutex 類滿足互斥體 (Mutex) 和標準布局類型 (StandardLayoutType) 的全部要求。
std::mutex 既不可復制亦不可移動。
成員類型native_handle_type(可選) 實現定義 成員函數(構造函數) 構造互斥(公開成員函數)(析構函數) 銷毀互斥(公開成員函數)operator=[被刪除] 不可復制賦值(公開成員函數) 鎖定lock 鎖定互斥,若互斥不可用則阻塞(公開成員函數)try_lock 嘗試鎖定互斥,若互斥不可用則返回(公開成員函數)unlock 解鎖互斥(公開成員函數) 原生句柄native_handle 返回底層實現定義的原生句柄(公開成員函數)注意:通常不直接使用 std::mutex :std::unique_lock 、 std::lock_guard 或 std::scoped_lock (C++17 起)以更加異常安全的方式管理鎖定。
recursive_mutex
recursive_mutex 類是同步原語,能用于保護共享數據免受從個多線程同時訪問。
recursive_mutex 提供排他性遞歸所有權語義:
- 調用方線程在從它成功調用 lock 或 try_lock 開始的時期里占有 recursive_mutex 。此時期間,線程可以進行對 lock 或 try_lock 的附加調用。所有權的時期在線程調用 unlock 匹配次數時結束。
- 線程占有 recursive_mutex 時,若其他所有線程試圖要求 recursive_mutex 的所有權,則它們將阻塞(對于調用 lock )或收到 false 返回值(對于調用 try_lock )。
- 可鎖定 recursive_mutex 次數的最大值是未指定的,但抵達該數后,對 lock 的調用將拋出std::system_error 而對 try_lock 的調用將返回 false 。
若 recursive_mutex 在仍為某線程占有時被銷毀,則程序行為未定義。 recursive_mutex 類滿足互
斥體 (Mutex) 和標準布局類型 (StandardLayoutType) 的所有要求。
可能的輸出:
in fun1, shared variable is now fun1 in fun2, shared variable is now fun2 in fun1, shared variable is now fun1 back in fun2, shared variable is fun1shared_mutex
shared_mutex 類是一個同步原語,可用于保護共享數據不被多個線程同時訪問。與便于獨占訪問的其他互斥類型不同,shared_mutex 擁有二個訪問級別:
- 共享 - 多個線程能共享同一互斥的所有權。
- 獨占性 - 僅一個線程能占有互斥。
- 若一個線程已獲取獨占性鎖(通過 lock 、 try_lock ),則無其他線程能獲取該鎖(包括共享的)。
僅當任何線程均未獲取獨占性鎖時,共享鎖能被多個線程獲取(通過 lock_shared 、 try_lock_shared )。
在一個線程內,同一時刻只能獲取一個鎖(共享或獨占性)。
共享互斥體在能由任何數量的線程同時讀共享數據,但一個線程只能在無其他線程同時讀寫時寫同一數據時特別有用。
shared_mutex 類滿足共享互斥體 (SharedMutex) 和標準布局類型 (StandardLayoutType) 的所有要求。
可能的輸出:
單核: 123084176803584 2 123084176803584 3 123084176803584 4 123084185655040 1 123084185655040 5 123084185655040 6 多核: 140623314495232 2 140623314495232 3 140623314495232 4 140623306102528 4 140623306102528 5 140623306102528 6總結
- 上一篇: web端获取微信小程序云数据库数据实现增
- 下一篇: 【181029】FreeEIM 飞鸽传书