如何用linux中的多线程程序C有效锁定普通变量

时间:2017-03-24 04:30:26

标签: c linux mutex memory-barriers

我编写C inLinux。通常情况下,我们可以使用mutex锁定&解锁多线程程序中的正常变量(例如intbool ...)。但我读了一些信息mutex没有效果。有人建议使用memory barrier代替volatile

你能不能有效地使用memory-barrier多线程程序中的正常变量,bool变量是交换真/假。

感谢您的支持。

1 个答案:

答案 0 :(得分:2)

互斥锁完全可以锁定访问权限(假设它是合法的互斥锁,使用得当,而不是一些自制的垃圾)。它可能不是最有效的,但它有效。

内存障碍通常足够,并且应该很少明确编码(相反,您使用适当的内存排序使用C11' stdatomic.h并让编译器根据需要处理插入障碍物)。但是原子学是一种微观优化,当你对线程很新时,它是不应该进入的。坚持使用简单的互斥锁,直到找到 need 来获得更细粒度的控制/速度。

volatile通常也是垃圾;它对于真正的原子来说是一个糟糕的方法,它在编译器和架构中并不一致,但在对原子有很好的支持之前就被滥用了,希望它有所帮助。它有各种各样的陷阱,同时提供很少的成本和成本。在跨线程同步数据时,volatile应该是您考虑的最后一件事;它适用于DMA硬件,不要将其用于其他目的。