std::atomic_wait, std::atomic_wait_explicit
來自 cppreference.com
定義於標頭檔案 <atomic> |
||
template< class T > void atomic_wait( const std::atomic<T>* object, |
(1) | (C++20 起) |
template< class T > void atomic_wait( const volatile std::atomic<T>* object, |
(2) | (C++20 起) |
template< class T > void atomic_wait_explicit( const std::atomic<T>* object, |
(3) | (C++20 起) |
template< class T > void atomic_wait_explicit( const volatile std::atomic<T>* object, |
(4) | (C++20 起) |
執行原子等待操作。其行為等同於重複執行以下步驟:
- 比較 object->load() (對於過載 (1,2))或 object->load(order) (對於過載 (3,4))的值表示與 old 的值表示。
- 如果它們按位相等,則阻塞直到 *object 被 std::atomic::notify_one() 或 std::atomic::notify_all() 通知,或執行緒被虛假地解除阻塞。
- 否則,返回。
即使底層實現虛假地解除阻塞,這些函式也保證只有在值發生變化時才返回。
1,2) 等價於 object->wait(old)。
3,4) 等價於 object->wait(old, order)。
如果 order 是 std::memory_order::release 和 std::memory_order::acq_rel 之一,則行為未定義。
目錄 |
[編輯] 引數
物件 | - | 指向要檢查和等待的原子物件的指標 |
old | - | 要檢查原子物件不再包含的值 |
順序 | - | 記憶體同步順序 |
[編輯] 返回值
(無)
[編輯] 注意
這種形式的變更檢測通常比簡單的輪詢或純自旋鎖更高效。
由於 ABA 問題,從 old 到另一個值然後又返回到 old 的瞬時變化可能會被錯過,而不會解除阻塞。
比較是按位的(類似於 std::memcmp);不使用比較運算子。不參與物件值表示的填充位將被忽略。
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參閱
(C++20) |
阻塞執行緒直到被通知且原子值改變 ( std::atomic<T> 的公共成員函式) |
(C++20) |
通知至少一個等待原子物件的執行緒 ( std::atomic<T> 的公共成員函式) |
(C++20) |
通知所有被原子物件阻塞的執行緒 ( std::atomic<T> 的公共成員函式) |
(C++20) |
通知一個在 atomic_wait 中阻塞的執行緒 (函式模板) |
(C++20) |
通知所有在 atomic_wait 中阻塞的執行緒 (函式模板) |