一次性自旋锁是否需要内存获取屏障?多场景代码验证分析
一次性自旋锁是否需要获取屏障?
我们都知道普通自旋锁、互斥锁在加锁时要添加获取屏障(acquire fence)来保证锁的语义,但一次性自旋锁是否也必须这么做?
示例1:基础C代码验证
下面的代码中,用relaxed语义的CAS获取一次性锁后,断言val为0是否总能成立?是不是必须把CAS的成功语义改成memory_order_acquire?
int val = 0; atomic_int lock = 0; void thread0(void) { int tmp = 0; if (atomic_compare_exchange_strong_explicit(&lock, &tmp, 1, memory_order_relaxed, memory_order_relaxed)) { // do we need memory_order_acquire here ? assert(!val); // will it always success? val = 1; } } // same as thread0 void thread1(void) { int tmp = 0; if (atomic_compare_exchange_strong_explicit(&lock, &tmp, 1, memory_order_relaxed, memory_order_relaxed)) { assert(!val); val = 1; } }
示例2:ARMv7-A架构汇编验证
下面的ARMv7-A汇编代码中,core0获取锁后没有加获取屏障,直接读取val,是否可能读到r5 != 0?
val: .long 0 lock: .long 0 core0: mov r0, #val mov r1, #lock mov r4, #1 2: ldrex r2, [r1] cmp r2, #0 beq 1f bx lr // ret 1: strex r3, r4, [r1] cmp r3, #0 bne 2b // without acquire fence ldr r5, [r0] // is r5 != 0 allowed? core1: mov r0, #val mov r1, #lock mov r4, #1 2: ldrex r2, [r1] cmp r2, #0 beq 1f bx lr // ret 1: strex r3, r4, [r1] cmp r3, #0 bne 2b dmb ish // acquire fence str r4, [r0] // store 1
示例3:工作与清理无竞争场景
下面的代码中,thread0用relaxed语义的CAS获取WORK_FLAG,是否需要改成memory_order_acquire?这里要求工作执行和清理操作不能有竞争。
#define EXIT_FLAG 1 #define WORK_FLAG 2 atomic_int state = 0; void thread0(void) { int tmp; while (1) { tmp = 0; if (!atomic_compare_exchange_strong_explicit(&state, &tmp, WORK_FLAG, memory_order_relaxed, memory_order_relaxed)) { // do we need acquire here? assert(tmp == EXIT_FLAG); return; } // do work tmp = WORK_FLAG; if (!atomic_compare_exchange_strong_explicit(&state, &tmp, 0, memory_order_release, memory_order_relaxed)) { assert(tmp == (EXIT_FLAG | WORK_FLAG)); // do the clean return; } } } void thread1(void) { int tmp = 0; while (1) { if (atomic_compare_exchange_strong_explicit(&state, &tmp, tmp | EXIT_FLAG, memory_order_acquire, memory_order_relaxed)) // we need acquire here to fit with release in thread0 break; } if (!(tmp & WORK_FLAG)) { // do the clean } }
内容的提问来源于stack exchange,提问作者untitled
相关产品推荐
相关产品推荐

