相关疑难解决方法(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++0x 的 atomic&lt;int&gt; 作为非原子访问

我的类型程序中有一个原子变量atomic<int>。在某些地方,我不需要以原子方式访问其中的值,因为我只是检查它是否为 0。换句话说,在这些情况下,我想避免在原子访问时发生的总线锁定等开销。

如何以非原子方式访问原子变量。使用 (int) 对其进行类型转换是否足够,如下所示?如果没有,我认为,我该怎么做?

atomic<int> atm;
int x;
........
x = (int)atm; // Would this be a non-atomic access, no bus locking et all?
Run Code Online (Sandbox Code Playgroud)

c++ atomic

4
推荐指数
1
解决办法
3327
查看次数

标签 统计

c++ ×2

atomic ×1

c++11 ×1