![](/img/trans.png)
[英]Understanding std::atomic::compare_exchange_weak() in C++11
[英]C++11 atomic library std::compare_and_exchange semantics
如果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>
代替第一個參數,即函數調用中的“ 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_strong
以T&
作為第一個參數。 atomic<T>
不能轉換為T&
(即使它可以轉換為T
類型的右值;這樣的轉換僅調用load()
)。
如果atomic<T>
可轉換為T&
,它將有效地提供對基礎原始存儲的無限制訪問,並允許用戶繞過任何同步機制隨意修改它。 首先,這將徹底擊敗擁有atomic
的觀點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.