2014-12-02 34 views
1

我有代碼(更新來修正工會結構排序):比較和交流薄弱的原子變量

union A { 
    struct { 
     short b; 
     short c; 
    }; 

    std::atomic<int> d; 
} 

,我想用零值來交換B和C(因此原子d) ,使用compare_exchange_weak()。所以我有這個:

A a; 
. 
. 
. 
std::atomic<int32_t> x = a.d.load(std::memory_order_relaxed); 
int32_t valToReplace = 0; 

return a.d.compare_exchange_weak(valToReplace, x, std::memory_order_release, std::memory_order_relaxed); 

我該怎麼做? compare_exchange_weak(),x的參數不能是原子的,所以我很困惑?

+0

我認爲你有'struct'和'union'嵌套錯誤的順序。聯合兩個'短'沒有任何意義。 – Sneftel 2014-12-02 09:26:26

+0

此外,'compare_exchange_weak'不會將'atomic'作爲參數。 – Sneftel 2014-12-02 09:28:33

+0

@Sneftel b和c應該一起代表d – user997112 2014-12-02 09:28:43

回答

0

本地變量x不應該是原子的。沒有理由,它不能用作compare_exchange_weak的參數,它需要一個常規值。

我不會評論你對聯盟所做的任何事情,因爲這對我毫無意義。

+0

我以錯誤的方式得到了工會。我想同時將兩個16位變量b和c的32位交換在一起? – user997112 2014-12-02 09:33:34

+0

@ user997112:然後要非常小心如何訪問'b'和'c',因爲聯合會繞過'd'的原子性質,並且很難避免數據競爭。你最好自己讀'd',然後提取你想要的值的任何一部分。 – 2014-12-02 09:37:46

+0

此結構存儲在另一個容器中。我應該只是將結構聲明爲原子,因此原子並忘記與原子變量的聯合? – user997112 2014-12-02 09:39:04