【发布时间】:2012-01-05 20:08:24
【问题描述】:
std::atomic 是 c++11 引入的新功能,但我找不到太多关于如何正确使用它的教程。那么以下做法是否普遍有效?
我使用的一种做法是我们有一个缓冲区,我想对一些字节进行 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), (amazon) 可能是目前最好的书,或者更确切地说,将是。
-
关于原子的教程并不多,因为除了像原子标志这样的一些简单案例之外,它是一个雷区。观看“The Hurt Locker”应该是使用原子的先决条件。使用锁!