std::atomic<T>::wait
来自cppreference.com
| (1) | (C++20 起) (C++26 起为 constexpr) |
|
| |
(2) | (C++20 起) |
进行原子等待操作。表现如同重复进行下列步骤:
- 比较
this->load(order)的值表示与old。- 如果它们相等,那么阻塞直到
*this被 notify_one() 或 notify_all() 提醒,或线程被虚假解除锁定。 - 否则直接返回。
- 如果它们相等,那么阻塞直到
这些函数保证只有在值更改时才返回,即使底层实现发生了虚假解除锁定。
如果 order 是 std::memory_order::release 和 std::memory_order::acq_rel 之一,那么行为未定义。
参数
| old | - | 要检测 atomic 的对象不再含有的值
|
| 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([&]
{
// 此 sleep 表示工作进行中
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 << "完成任务数 = " << completion_count.load() << '\n';
}
输出:
完成任务数 = 16
参阅
(C++20) |
提醒至少一个在原子对象上的等待中阻塞的线程 (公开成员函数) |
(C++20) |
提醒所有在原子对象上的等待中阻塞的线程 (公开成员函数) |
(C++20) |
提醒一个在 atomic_wait 中阻塞的线程 (函数模板) |
(C++20) |
提醒所有在 atomic_wait 中阻塞的线程 (函数模板) |