- 主题:seq_cst 和 acq_rel 区别到底在哪
acq-rel不是单个线程的序
原子变量A 在线程1 中release了,在线程2中,只要是使用了acquire,只要线程2的acquire动作是在线程1的release之后发生的,那一定能看到线程1中 原子变量A已经release出来的值
我觉得跟acq-rel 不能保证 store-load 不被乱序有关呢
【 在 z16166 的大作中提到: 】
: seq_cst是全局顺序,所有线程看到的操作顺序都一致
: acq_rel只是规定单个线程的顺序。
: 所以还要看是不是多线程调用这个类的。
--
修改:overcomeunic FROM 111.222.57.*
FROM 111.222.57.*
如果是代码中其它地方导致的data race,seq_cst应该也有才对
但一开始说从acq_rel -> seq_cst 就好了,这是疑惑的点
另外我好奇的是,acq_rel 比 seq_cst 好很多么性能上
【 在 z16166 的大作中提到: 】
: 你说的对
: 这个最好是举两个线程操作这个cache的例子,找到race的地方
: 野指针也不一定是这个类的问题
: ...................
--
修改:overcomeunic FROM 111.222.57.*
FROM 111.222.57.*
执行环境究竟是啥呀?不是X86吧
X86 的话一展开,汇编代码是一样的,没想明白为啥呀
【 在 zli07 的大作中提到: 】
: 嗯,实际上clang在armv8上可能只实现了一套,低版本clang通过ldaxr+stlxr+循环实现,高版本直接用STL里的方法
:
--
FROM 111.222.57.*
X86不应该有问题
acquire-release/sequence_consistency 对于原子的exchange,最后产出的汇编都是 xchgq ,这个隐式带了lock,保证了写入的数据 其它核都能看到,都是一样的
【 在 z16166 的大作中提到: 】
: 开了几个线程跑,没发现问题
: template <typename T> struct LocklessCache {
: std::atomic<T *> caches[4];
: ...................
--
FROM 106.11.31.*