Namespaces
Variants

std::atomic<T>:: wait

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
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 =

std:: memory_order_seq_cst ) const volatile noexcept ;
(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)
通知所有在原子对象上阻塞等待的线程
(公开成员函数)
通知在 atomic_wait 中阻塞的线程
(函数模板)
通知所有在 atomic_wait 中阻塞的线程
(函数模板)