簡體   English   中英

c++ 如何組合原子操作?

[英]How does c++ compose atomic operations?

C++ 原子是好東西,我的問題只是它們如何組合在一起。

    uint64_t lpp = (place_st++ == A-1)? place_st.exchange(0) : place_st.load();

    ...
    atomic<uint64_t> place_st;
    ...

那么,是否可以保證這些操作只會像在事務內存中一樣一一執行

原子操作只承諾原子性(以及給定正確參數的相對順序):不同線程上的其他操作無法干擾它們的操作。 兩個都是原子的操作仍然是兩個操作,因此它們之間可能會發生一些事情。

不,不會有任何保證,使代碼不安全(一個線程可能會看到一個大於A的值,並且增量可能會被place_st.exchange(0) '丟失'。

這里最簡單的方法可能是將place_st視為“未包裝”,然后手動執行uint64_t lpp = place_st++ % A以獲得“已包裝”版本。 除此之外,要獲得這種行為,您基本上需要在循環中進行比較和交換(請參閱如何在 C++ 中為共享計數器實現簡單的比較和交換),而不是原子增量,以獲取增量和包裝以原子方式行事。 由於您只對單個變量進行操作,因此您可以使用 CAS 來模擬您正在考慮的事務內存方法。

暫無
暫無

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

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