linux下多线程程序C如何有效锁定正态变量

linux下多线程程序C如何有效锁定正态变量,c,linux,mutex,memory-barriers,C,Linux,Mutex,Memory Barriers,我在Linux中编写了C程序。通常,我们可以使用互斥锁来锁定和解锁一个普通变量,例如int,bool。。。在多线程程序中。但是我读到的一些信息互斥是无效的。有人建议使用内存屏障而不是易失性 举例来说,在多线程程序中,当bool变量为exchange true/false时,您能否有效且准确地为普通变量使用内存屏障 感谢您的支持。假定互斥锁是合法的互斥锁,使用得当,而不是一些自制的垃圾,那么互斥锁在锁定访问方面是非常好的。它可能不是最有效的,但它是有效的 内存障碍通常是不够的,很少需要显式编码。相

我在Linux中编写了C程序。通常,我们可以使用互斥锁来锁定和解锁一个普通变量,例如int,bool。。。在多线程程序中。但是我读到的一些信息互斥是无效的。有人建议使用内存屏障而不是易失性

举例来说,在多线程程序中,当bool变量为exchange true/false时,您能否有效且准确地为普通变量使用内存屏障


感谢您的支持。

假定互斥锁是合法的互斥锁,使用得当,而不是一些自制的垃圾,那么互斥锁在锁定访问方面是非常好的。它可能不是最有效的,但它是有效的

内存障碍通常是不够的,很少需要显式编码。相反,您应该使用C11的stdatomic.h,使用适当的内存顺序,并让编译器根据需要处理插入障碍。但原子学是一种微观优化,当你显然还不熟悉线程时,你真的不应该涉足其中。坚持使用简单的互斥体,直到您发现需要更细粒度的控制/速度


挥发性物质通常也是垃圾;对于真正的原子学来说,这是一个糟糕的sop,它不能在编译器和体系结构之间一致地工作,但在原子学得到良好支持之前就被滥用了,希望它能有所帮助。它有各种各样的陷阱,但提供的东西很少,成本也很高。当跨线程同步数据时,易失性应该是你考虑的最后一件事;这是用于DMA硬件的,不要将其用于其他目的。

我觉得很难决定,因为Linus不使用C11。所以,我不想使用记忆障碍。我在程序中使用了互斥,现在我想提高速度。谢谢。@TrungTrinh:Linux不使用C11-这没有意义。glibc应该是C11兼容的,主要是在最近的发行版上,gcc也支持C11,因为4.7 4.9提供了完整的atomics支持,在此之前,大多数兼容的解决方案都是通过外部头来实现的。@TrungTrinh:Linux内核使用C89,因为它是一个大型的遗留代码库,升级会带来各种兼容性问题。这并不是所有代码都应该是C89的原因。已经28年了;已经有了有意义的改进。gcc在这一点上默认为C11,从不合适的原语(如内存屏障)重新创建自己的线程/同步结构在这一点上不应该是您关心的。@ShadowRanger:谢谢: