如果我正在访问共享内存以进行只读,要检查if()
块的条件,我还应该锁定互斥锁吗? E.g。
mutex_lock();
if (var /* shared memory */) {
}
mutex_unlock();
这里需要锁定和良好做法吗?
答案 0 :(得分:4)
如果您正在阅读的变量可以同时写入,那么是的,您应该获取对互斥锁的锁定。
如果你的编译器为你提供了必要的原语,你只能原子地读它。这可能是C11和C ++ 11附带的原子功能,也可能是编译器提供的其他语言扩展。然后你可以将互斥量获取移动到条件中,但是如果你等到测试后获得互斥量,那么其他人可能会在你测试它和你获得互斥锁的时间之间改变它:
if (example) {
// "example" variable could be changed here by another thread.
mutex_lock();
// Now the condition might be false!
mutex_unlock();
}
因此,我建议在条件之前获取互斥锁,除非分析已经将互斥量获取确定为瓶颈。 (并且在测试变量大于CPU寄存器的情况下 - 例如32位CPU上的64位数字 - 那么你甚至没有选择推迟互斥量获取而没有其他类型原子获取或比较原语。)