![](/img/trans.png)
[英]Why can't TBB cast `int` to `const tbb::atomic<unsigned int>&`, but std::atomic can?
[英]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
類型上調用。
參考:
這個問題有兩個層面。
首先是簡單且技術性的 - std::atomic
不可移動構造或移動可分配,如其他答案中所述。
其次是這背后的基本原理——交換std::atomic
本身並不是原子的。 並且由於std::atomic
在多線程環境中使用,添加swap
會由於可能的誤解而導致廣泛的錯誤(因為std::atomic
有swap
,所以它本身就是原子的)。
總而言之——如果你不需要原子swap
,這可以很容易地使用提到的exchange
來完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.