2014-12-08 34 views
2
bool expected = false; 
extern std::atomic<bool> current; // set somewhere else 
while (!current.compare_exchange_weak(expected, true) 
     && !expected); 

什麼是使用此代碼與current.exchange(expected)原子交換vs compare_exchange_xxx

exchange是否會誘發一些競爭條件?

編輯:同樣的問題與current.store(expected)

+0

它可能取決於修改'current'的其他線程中發生了什麼。他們在做什麼? – 2014-12-08 09:04:41

+0

其實我的問題更多關於教育目的,如果別人線程做current.store或current.exchange有一些區別嗎? – Guillaume07 2014-12-08 09:07:34

回答

0

exchangecompare_exchange_weak具有不同一般的語義,但在你的例子它看起來並不像你依靠這將證明,任何行爲。如果你有兩個或更多的線程競相寫入相同的值,誰先到達那裏並不重要,事實上你甚至不需要std :: atomic的保護。要理解這些差異,你必須看一個例子,其中給定線程的行爲取決於在到達exchangecompare_exchange_weak之前發生的事情。