如果sequenceNumberatomic<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_strongT&作为其第一个参数。 atomic<T>不能转换为T&(即使它可以转换为T类型的右值;这样的转换仅调用load())。

如果atomic<T>可转换为T&,它将有效地提供对基础原始存储的无限制访问,并允许用户绕过任何同步机制随意对其进行修改。首先,这将彻底挫败atomic的观点。

关于c++ - C++ 11原子库std::compare_and_exchange语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24844190/

10-13 06:49