我编写C inLinux。通常情况下,我们可以使用mutex
锁定&解锁多线程程序中的正常变量(例如int
,bool
...)。但我读了一些信息mutex
没有效果。有人建议使用memory barrier
代替volatile
。
你能不能有效地使用memory-barrier
多线程程序中的正常变量,bool变量是交换真/假。
感谢您的支持。
答案 0 :(得分:2)
互斥锁完全可以锁定访问权限(假设它是合法的互斥锁,使用得当,而不是一些自制的垃圾)。它可能不是最有效的,但它有效。
内存障碍通常不足够,并且应该很少明确编码(相反,您使用适当的内存排序使用C11' stdatomic.h
并让编译器根据需要处理插入障碍物)。但是原子学是一种微观优化,当你对线程很新时,它是不应该进入的。坚持使用简单的互斥锁,直到找到 need 来获得更细粒度的控制/速度。
volatile
通常也是垃圾;它对于真正的原子来说是一个糟糕的方法,它在编译器和架构中并不一致,但在对原子有很好的支持之前就被滥用了,希望它有所帮助。它有各种各样的陷阱,同时提供很少的成本和成本。在跨线程同步数据时,volatile
应该是您考虑的最后一件事;它适用于DMA硬件,不要将其用于其他目的。