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

How to lock effectively for normal variable with multi-thread program C in linux

我在 Linux 中编写 C 语言。通常,我们可以在多线程程序中使用mutex 来锁定和解锁一个普通变量(例如intbool...)。但是我看了一些资料mutex 没有效果。有人建议使用 memory barrier 而不是 volatile

你能不能在多线程程序中有效且准确地使用 memory-barrier 作为普通变量,与 bool 变量交换 true/false.

感谢您的支持。

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

内存屏障通常不够,并且很少应该显式编码(相反,您可以使用 C11 的 stdatomic.h 和适当的内存排序并让编译器处理根据需要插入障碍)。但是原子是一种微优化,当您显然不熟悉线程时,您真的不应该涉足。坚持使用简单的互斥锁,直到找到 需要 更细粒度的 control/speed.

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