的std ::原子被C引入的新功能+ + 11,但我無法找到如何正確地使用它很多的教程。那麼下面的做法是否通用和有效?我用如何使用std ::原子有效
的一個做法是,我們有一個緩衝,我想CAS的一些字節,所以我所做的就是:
uint8_t *buf = ....
auto ptr = reinterpret_cast<std::atomic<uint8_t>*>(&buf[index]);
uint8_t oldValue, newValue;
do {
oldValue = ptr->load();
// Do some computation and calculate the newValue;
newValue = f(oldValue);
} while (!ptr->compare_exchange_strong(oldValue, newValue));
所以我的問題是:
- 上面的代碼的用途醜陋的reinterpret_cast,並且這是檢索參考位置的原子指針的正確方法& buf [index]?
- 是一個機器字的單個字節比CAS顯著慢CAS,所以我應該避免使用它?我的代碼看起來更復雜,如果我改變它來加載一個單詞,提取字節,計算並設置新值的字節,並做CAS。這使代碼更加複雜,我也需要自己處理地址對齊問題。
編輯:如果這些問題是處理器/架構依賴,那麼x86/x64處理器的結論是什麼?
C++ Concurrency in Action [(early access)](http://www.manning.com/williams/),[(amazon)](http://www.amazon.com/gp/product/1933988770/) REF = as_li_qf_sp_asin_tl?ie = UTF8&tag = gummadoon-20&linkCode = as2&camp = 1789&creative = 9325&creativeASIN = 1933988770)可能是目前這個話題的最好的書,或者說更確切的說是。 – Cubbi 2012-01-05 20:37:46
關於原子的教程並不多,因爲除了像原子標誌這樣的一些簡單情況外,它是一個雷區。看「拆彈機」應該是使用原子的先決條件。使用鎖! – 2012-01-05 23:51:07