C ++ 11原子库std :: compare_and_exchange语义

时间:2014-07-19 19:30:03

标签: c++ c++11 concurrency atomic

如果sequenceNumberatomic<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()吗?

1 个答案:

答案 0 :(得分:1)

atomic<T>::compare_exchange_strongT&作为其第一个参数。 atomic<T>无法转换为T&(即使它可转换为T类型的右值;此类转换仅调用load())。

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