记录
有一个项目里乱用 atomic 内存序 , 全部用了 memory_order_relaxed, 都不知道是怎么测过的.
memory_order_acquire - release :
1.至少2个线程需要对这个变量操作
2.假设A线程release , B线程acquire , 此时将进行同步, B线程acquire 确保是A线程release的值是最新的.
3.还有个作用, B线程acuqire后, A线程release之前的写操作都已经完成.
总结 release 的作用 : 在release 之前的变量都同步了
伪代码例子:
//只注意 k 变量即可
void thread_A() {
a.store(1, relaxed);
b.store(1, relaxed);
c.store(1, relaxed);
//**********注意 , a,b,c 在relase 一定是完成的
k.store(true, release);
}
void thread_B() {
...
// 直到 A 线程的 k.store(true, release) 退出循环
while( ! k.load(acquire) )
// 这里可以保证 a, b, c 3个变量都已经写完
// 可以用assert 验证一下
}
memory_order_consume - release : 这个好像我自己用的比较多一些
1.也是在至少2个线程需要对这个变量操作
2.上面的 acquire - release , release 在执行的时候会把他之前的操作都完成了. 但此时我根本不关心release之前的那些变量, 另一个线程根本用不着 ; 此时就可以使用 consume - release;
3.相对于 acq