相关疑难解决方法(0)

如何有效地使用std :: atomic

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));
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 上面的代码使用丑陋的reinterpret_cast,这是检索引用位置&buf [index]的原子指针的正确方法吗?
  2. 单个字节上的CAS是否明显慢于机器字上的CAS,因此我应该避免使用它?如果我更改它以加载一个字,提取字节,计算并设置新值中的字节,并执行CAS,我的代码看起来会更复杂.这使代码更复杂,我还需要自己处理地址对齐.

编辑:如果这些问题依赖于处理器/体系结构,那么x86/x64处理器的结论是什么?

c++ c++11

23
推荐指数
2
解决办法
2万
查看次数

标签 统计

c++ ×1

c++11 ×1