如何在 linux 中使用多线程程序 C 有效地锁定正态变量



>I program C inLinux.通常,我们可以使用mutex在多线程程序中锁定和解锁正态变量(例如intbool...)。但我阅读了一些信息mutex没有有效。有人建议使用memory barrier而不是volatile

您能否举例memory-barrier有效且准确地用于多线程程序中的普通变量,布尔变量交换真/假。

感谢您的支持。

互斥体在锁定访问方面非常出色(假设它是一个合法的互斥锁,使用得当,而不是一些家庭垃圾)。它可能不是最有效的,但它是有效的。

内存屏障通常是不够的,并且很少应该显式编码(相反,您将使用具有适当内存排序的 C11stdatomic.h,并让编译器根据需要处理插入屏障)。但是原子是一种微优化,当你显然不熟悉线程时,你真的不应该进入。坚持使用简单的互斥锁,直到您发现需要更细粒度的控制/速度。

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

最新更新