软件互斥锁不适用于乱序执行
Software mutex not working with out of order execution
文章https://en.m.wikipedia.org/wiki/Mutual_exclusion#Software_solutions中给出
These algorithms do not work if out-of-order execution is used on the platform that executes them. Programmers have to specify strict ordering on the memory operations within a thread.
但是那些算法是简单的 C 程序,如果我们不能确定它们在 ooo 系统中按预期工作,我们如何能确定我们的其他程序将正确工作?
这些程序在 ooo 情况下会做什么失败?
ooo 程序基本上什么时候不起作用,所以我们可以小心使用它们?
我们可以信任 ooo 处理器来执行我们编写的代码吗?
程序内(更准确地说是线程内)乱序执行没有问题。如果存在并发(两个或更多线程 运行 并行),例如使用软件互斥体,这只会导致问题。
具有 mfence
(或在特殊情况下为 lfence
和 sfence
的障碍)可以在 x86 平台上提供帮助。它们指示处理器此时不会发生乱序执行。这些是汇编指令,所以在 C 中你必须写
asm volatile("mfence");
或使用相应的指令。
另一个问题可能是编译器对指令的排列方式与程序中的指令不同,或者进行了其他优化(例如,根本不将值写入内存,而是将它们保存在寄存器中)。为防止这种情况,必须在用于软件互斥的变量处使用关键字 volatile
。
文章https://en.m.wikipedia.org/wiki/Mutual_exclusion#Software_solutions中给出
These algorithms do not work if out-of-order execution is used on the platform that executes them. Programmers have to specify strict ordering on the memory operations within a thread.
但是那些算法是简单的 C 程序,如果我们不能确定它们在 ooo 系统中按预期工作,我们如何能确定我们的其他程序将正确工作? 这些程序在 ooo 情况下会做什么失败? ooo 程序基本上什么时候不起作用,所以我们可以小心使用它们? 我们可以信任 ooo 处理器来执行我们编写的代码吗?
程序内(更准确地说是线程内)乱序执行没有问题。如果存在并发(两个或更多线程 运行 并行),例如使用软件互斥体,这只会导致问题。
具有 mfence
(或在特殊情况下为 lfence
和 sfence
的障碍)可以在 x86 平台上提供帮助。它们指示处理器此时不会发生乱序执行。这些是汇编指令,所以在 C 中你必须写
asm volatile("mfence");
或使用相应的指令。
另一个问题可能是编译器对指令的排列方式与程序中的指令不同,或者进行了其他优化(例如,根本不将值写入内存,而是将它们保存在寄存器中)。为防止这种情况,必须在用于软件互斥的变量处使用关键字 volatile
。