std::atomic<T>:: wait
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic::wait
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Constants | ||||
|
(C++17)
|
||||
| Specialized member functions | ||||
|
Specialized for integral,
floating-point (C++20) and pointer types |
||||
|
Specialized for integral and
pointer types only |
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Specialized for integral types only | ||||
|
void
wait
(
T old,
std::
memory_order
order
=
std:: memory_order_seq_cst ) const noexcept ; |
(1) |
(C++20 起)
(C++26 起为 constexpr) |
|
void
wait
(
T old,
< a href="../memory_order.html">
std::
memory_order
order
=
|
(2) | (C++20 起) |
执行原子等待操作。行为表现为重复执行以下步骤:
-
将
this
-
>
load
(
order
)
的
值表示
与
old
的值表示进行比较。
- 如果两者相等,则阻塞直到 * this 被 notify_one() 或 notify_all() 通知,或线程被伪唤醒。
- 否则,立即返回。
这些函数保证仅在值发生更改时返回,即使底层实现出现伪唤醒。
如果 order 不是 std:: memory_order_relaxed 、 std:: memory_order_consume 、 std:: memory_order_acquire 或 std:: memory_order_seq_cst ,则行为未定义。
目录 |
参数
| old | - | 用于校验原子对象不再包含的值 |
| order | - | 需强制执行的内存顺序约束 |
注释
这种变更检测形式通常比简单轮询或纯自旋锁更高效。
由于 ABA问题 ,从 old 到其他值再回到 old 的瞬时变化可能被遗漏,导致无法解除阻塞。
比较操作按位进行(类似于 std::memcmp );不使用任何比较运算符。永远不会参与对象值表示的填充位将被忽略。
示例
#include <atomic> #include <chrono> #include <future> #include <iostream> #include <thread> using namespace std::literals; int main() { std::atomic<bool> all_tasks_completed{false}; std::atomic<unsigned> completion_count{}; std::future<void> task_futures[16]; std::atomic<unsigned> outstanding_task_count{16}; // 生成多个执行时间不同的任务, // 然后减少未完成任务计数。 for (std::future<void>& task_future : task_futures) task_future = std::async([&] { // 此休眠代表执行实际工作... std::this_thread::sleep_for(50ms); ++completion_count; --outstanding_task_count; // 当任务计数降为零时,通知 // 等待者(本例中为主线程)。 if (outstanding_task_count.load() == 0) { all_tasks_completed = true; all_tasks_completed.notify_one(); } }); all_tasks_completed.wait(false); std::cout << "Tasks completed = " << completion_count.load() << '\n'; }
输出:
Tasks completed = 16
参见
|
(C++20)
|
通知至少一个在原子对象上等待的线程
(公开成员函数) |
|
(C++20)
|
通知所有在原子对象上阻塞等待的线程
(公开成员函数) |
|
(C++20)
|
通知在 atomic_wait 中阻塞的线程
(函数模板) |
|
(C++20)
|
通知所有在 atomic_wait 中阻塞的线程
(函数模板) |