簡體   English   中英

C ++ 11原子庫std :: compare_and_exchange語義

[英]C++11 atomic library std::compare_and_exchange semantics

如果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>代替第一個參數,即函數調用中的“ 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()在那種情況下我也應該去seq_no > sequenceNumber.load()嗎?

atomic<T>::compare_exchange_strongT&作為第一個參數。 atomic<T>不能轉換為T& (即使它可以轉換為T類型的右值;這樣的轉換僅調用load() )。

如果atomic<T>可轉換為T& ,它將有效地提供對基礎原始存儲的無限制訪問,並允許用戶繞過任何同步機制隨意修改它。 首先,這將徹底擊敗擁有atomic的觀點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM