- 主题:seq_cst 和 acq_rel 区别到底在哪
之前写了个缓存实现
template<typename T>
struct Cache {
std::atomic<T *> caches[4];
T *get() {
for (auto &o: caches) {
if (T *t = o.exchange(nullptr) return t;
}
return new T();
}
void release(T *t) {
for(auto &o: caches) {
t = o.exchange(t);
if (t == nullptr) return;
}
delete t;
}
};
一开始 exchange 使用的是 std::memory_order_acq_rel,感觉足矣,但是线上出现了野指针。改成默认的 seq_cst 就没问题了。
但是我看二者产生的指令是一样的呀,求问这二者具体区别在哪?我理解是访问多个 atomic 的话要使用 seq_cst?
--
FROM 114.251.196.*
会不会因为分支预测错误导致乱序执行呢,seq_cst 会保证多个原子操作顺序一致,acq_rel 只会保证单个原子操作正确
【 在 Algoquant 的大作中提到: 】
: 原子操作就是有一天你觉得懂了,然后某一天又不懂了,还是用成熟的库,好,自己写的话,只敢上保守方案。
: 这个例子 看起来是 acq rel 好像就可以了,因为操作具体atomic变量的时候,并不依赖其他原子变量的取值,你的循环只是挨个检查而已。
--
FROM 114.251.196.*
嗯,实际上clang在armv8上可能只实现了一套,低版本clang通过ldaxr+stlxr+循环实现,高版本直接用STL里的方法
【 在 snnn 的大作中提到: 】
:
: 你确定?? 要是汇编代码是完全一样,那么执行行为肯定是一模一样。
: x86上是strong order,C++标准中规定的那些memory order大部分对于x86都是nonsense。给arm写程序的才需要关心这些细节。x86上只要保证原子性就够了,具体看编译后的汇编代码,对着Intel handbook对照着看。
: ...................
--
修改:zli07 FROM 114.251.196.*
FROM 114.251.196.*