在文章https://en.m.wikipedia.org/wiki/Mutual_exclusion#Software_solutions中,
如果在执行算法的平台上使用乱序执行,这些算法将不起作用。程序员必须对线程内的内存操作指定严格的顺序。
但是这些算法是简单的C程序,如果我们不能确定它们是否可以在ooo系统中按预期工作,那么如何确保其他程序可以正常工作? 这些程序在失败的情况下会导致什么失败? 基本上,什么时候ooo程序不起作用,所以我们可以小心使用它们吗? 我们可以信任ooo处理器来执行我们的代码吗?
答案 0 :(得分:2)
程序内(更确切地说,在线程内)无序执行没有问题。仅当存在并发(两个或多个线程并行运行)时(例如,使用软件互斥锁),这才可能导致问题。
带有mfence
(在特殊情况下为lfence
和sfence
)的障碍可以帮助x86平台。它们指示处理器此时不会发生乱序执行。这些是汇编程序指令,因此在C语言中,您必须编写
asm volatile("mfence");
或使用相应的指令。
另一个问题可能是编译器对指令的排列方式与程序中的排列方式不同或进行其他优化(例如,根本不将值写入内存,而是将其保存在寄存器中)。为避免这种情况,必须在用于软件互斥锁的变量上使用关键字volatile
。