之前写了个缓存实现
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.*