std::atomic<T>::wait
来自cppreference.com
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, std::memory_order order = |
(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 中阻塞的线程 (函数模板) |