在C++中,`std::atomic::compare_exchange`函数的选择主要基于业务需求和数据对象的特性。选择`strong`版本的比较与交换操作,通常意味着在比较不匹配时不需要循环,这是更优的选择,除非数据类型`T`的表示可能包含填充位、陷阱位或提供相同值的不同对象表示(如浮点数的NaN)。在这些情况下,弱比较与交...
compare_exchange_strong函数直接比较所包含值的物理内容,这可能会导致对相等使用的值进行比较失败(如果基...
https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchangeen.cppreference.com/w/cpp/atomic/atomic/compare_exchange 及: 【公开课】C++11开始的多线程编程(#5)_哔哩哔哩_bilibiliwww.bilibili.com/video/BV1Ya411q7y4 有: main.cpp #include<iostream>#include<atomic>#include<mutex>templat...
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst); bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile; bool A::compare_exchange_strong(C & expected, C desired, memory_order order...
boolcompare_exchange_strong(T&expected, T desired, std::memory_orderorder= std::memory_order_seq_cst)volatilenoexcept; 原子地比较*this和expected的对象表示(C++20 前)值表示(C++20 起),而若它们逐位相等,则以desired替换前者(进行读修改写操作)。否则,将*this中的实际值加载进expected(进行加载操作)。
当compare_exchange_weak比较和交换会要求循环,而compare_exchange_strong不要求时,推荐用std::compare_exchange_strong,除非T的对象表示可包含填充位、(C++20 前)陷阱位或为同一值提供多个对象表示(例如浮点 NaN)。这些情况下,compare_exchange_weak一般均可用,因为它在一些稳定对象表示上快速收敛。
std::atomic<T>::compare_exchange_weak,std::atomic<T>::compare_exchange_strong 定义于头文件<atomic> (1)(C++11 起) boolcompare_exchange_weak(T&expected, T desired, std::memory_ordersuccess, std::memory_orderfailure)noexcept; boolcompare_exchange_weak(T&expected, T desired, ...
而这些存取操作也只限于他自己的store,load,exchange,compare_exchange_weak,compare_exchange_strong,...
bool atomic_compare_exchange_strong( std::atomic<T>* obj, typename std::atomic<T>::value_type* expected, typename std::atomic<T>::value_type desired ) noexcept; template< class T > bool atomic_compare_exchange_strong( volatile std::atomic<T>* obj, typename std::atomic<T>::value_type...
3.compare_exchange_weak/strong函数可以保证“比较-交换”的原子化。compare_exchange_weak可能失败,即此函数可能与expected值相等的情形下atomic的T值没有替换为disired(atomic值未变)且返回false,这可能发生在缺少单条CAS操作(“比较-交换”指令)的机器上,所以通常使用一个循环中。