如果sequenceNumber
是atomic<int>
(seq_no只是一个整数),
为什么
sequenceNumber.compare_exchange_strong(sequenceNumber, seq_no );
无法编译?
我在
compare_exchange_strong
操作之前进行了与原子变量sequenceNumber的比较操作,想检查在我实际在线程中更新它时,另一个线程是否更改了sequenceNumber的值。像这样:
if ( seq_no > sequenceNumber )
sequenceNumber.compare_exchange_strong(sequenceNumber, seq_no);
我通过以下方式修复它:
int current_sequence_number = sequenceNumber.load();
if ( seq_no > current_sequence_number )
sequenceNumber.compare_exchange_strong(current_sequence_number, seq_no );
但是我想知道为什么编译器不允许我使用
atomic<int>
代替第一个参数,即函数调用中的“ expected”参数-bool compare_exchange_strong( T& expected, T desired,
std::memory_order order =
std::memory_order_seq_cst );
禁止使用原子变量代替期望的参数的动机是什么(尤其是在似乎允许使用
seq_no > sequenceNumber
的情况下)?顺便说一句,使用
seq_no > sequenceNumber
也是错误的吗? (即使它可以编译)在那种情况下我也应该去seq_no > sequenceNumber.load()
吗? 最佳答案
atomic<T>::compare_exchange_strong
将T&
作为其第一个参数。 atomic<T>
不能转换为T&
(即使它可以转换为T
类型的右值;这样的转换仅调用load()
)。
如果atomic<T>
可转换为T&
,它将有效地提供对基础原始存储的无限制访问,并允许用户绕过任何同步机制随意对其进行修改。首先,这将彻底挫败atomic
的观点。
关于c++ - C++ 11原子库std::compare_and_exchange语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24844190/