如果sequenceNumber
是atomic<int>
(seq_no只是一个int),
为什么
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>
代替第一个参数,即&#34;期望&#34;函数调用中的参数 -
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()
吗?
答案 0 :(得分:1)
atomic<T>::compare_exchange_strong
将T&
作为其第一个参数。 atomic<T>
无法转换为T&
(即使它可转换为T
类型的右值;此类转换仅调用load()
)。
如果atomic<T>
可转换为T&
,它将有效地提供对底层原始存储的无限制访问,并允许用户随意修改它,绕过任何同步机制。这将彻底击败首先拥有atomic
的观点。