>I program C inLinux.通常,我们可以使用mutex
在多线程程序中锁定和解锁正态变量(例如int
、bool
...)。但我阅读了一些信息mutex
没有有效。有人建议使用memory barrier
而不是volatile
。
您能否举例memory-barrier
有效且准确地用于多线程程序中的普通变量,布尔变量交换真/假。
感谢您的支持。
互斥体在锁定访问方面非常出色(假设它是一个合法的互斥锁,使用得当,而不是一些家庭垃圾)。它可能不是最有效的,但它是有效的。
内存屏障通常是不够的,并且很少应该显式编码(相反,您将使用具有适当内存排序的 C11stdatomic.h
,并让编译器根据需要处理插入屏障)。但是原子是一种微优化,当你显然不熟悉线程时,你真的不应该进入。坚持使用简单的互斥锁,直到您发现需要更细粒度的控制/速度。
volatile
通常也是垃圾;对于真正的原子来说,这是一个糟糕的SOP,在编译器和架构中不能一致地工作,但在对原子的良好支持之前就被滥用了,希望它会有所帮助。它有各种各样的陷阱,同时提供的东西很少,成本很高。 在跨线程同步数据时,volatile
应该是您考虑的最后一件事;它适用于 DMA 硬件,请勿将其滥用于其他目的。