gpt4 book ai didi

c++ - std::atomic::wait 的 std::memory_order

转载 作者:行者123 更新时间:2023-12-02 07:43:46 25 4
gpt4 key购买 nike

根据cppreference,在C++20中有wait , notify_one , notify_allstd::atomic<T> 。看起来他们做 std::atomic<T>可用作futex

我问为什么 wait接受 std::memory_order 作为参数。由于我总是需要检查从等待中唤醒是否不是虚假的,因此我将在相应的加载中指定内存顺序:

  std::atomic<bool> x;

while (x.load(std::memory_order_acquire) == false)
{
x.wait(false, std::memory_order_acquire);
}

或者我应该指定 std::memory_order_relaxed等待?是否有 wait 的场景后面没有load

最佳答案

同一对象上的所有原子操作将始终具有单个顺序,并且单个线程内的顺序也包含在其中。也就是说,relaxed 无法对同一线程中同一对象的原子操作重新排序。

宽松的内存顺序是相对于除特定原子操作之外的其他内存操作的顺序。因此,relaxed 适合检查等待本身,但是当您想要实际读取由释放线程写入的数据时,包含在原子值中,您需要更强的内存顺序才能确保它们的可见性。因此,如果有必要,您的外循环应该使用更合适的条件来获取可见性。

关于c++ - std::atomic<T>::wait 的 std::memory_order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60359694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com