簡體   English   中英

為什么不能 std::atomic<t> 被交換?</t>

[英]Why can't std::atomic<T> be swapped?

#include <atomic>

int main()
{
    auto a = std::atomic_int(1);
    auto b = std::atomic_int(2);

    std::swap(a, b); // error
}

錯誤信息:

錯誤:沒有匹配的 function 調用 'swap(std::atomic&, std::atomic&)'

為什么不能交換std::atomic<T>

std::atomic有一個已刪除的復制構造函數,並且沒有移動構造函數。

因此它既不是move assignable也不是move constructible

因此std::swap不能在任何std::atomic類型上調用。

參考:

https://en.cppreference.com/w/cpp/algorithm/swap

這個問題有兩個層面。

首先是簡單且技術性的 - std::atomic不可移動構造或移動可分配,如其他答案中所述。

其次是這背后的基本原理——交換std::atomic本身並不是原子的。 並且由於std::atomic在多線程環境中使用,添加swap會由於可能的誤解而導致廣泛的錯誤(因為std::atomicswap ,所以它本身就是原子的)。

總而言之——如果你不需要原子swap ,這可以很容易地使用提到的exchange來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM