【问题标题】:Software mutex not working with out of order execution软件互斥锁不适用于乱序执行
【发布时间】:2023-09-27 08:10:01
【问题描述】:

https://en.m.wikipedia.org/wiki/Mutual_exclusion#Software_solutions的文章中给出了

如果在执行它们的平台上使用乱序执行,这些算法将不起作用。程序员必须对线程内的内存操作指定严格的顺序。

但是这些算法是简单的 C 程序,如果我们不能确定它们在 ooo 系统中是否按预期工作,我们如何确定我们的其他程序可以正常工作? 这些程序在 ooo 情况下会做什么失败? 基本上ooo程序什么时候不工作,所以我们可以小心使用它们? 我们可以信任 ooo 处理器来完成我们编写的代码吗?

【问题讨论】:

  • 使用操作系统内核锁定。这肯定会奏效,(否则您的操作系统将无法通过引导)。

标签: c optimization concurrency processor mutual-exclusion


【解决方案1】:

在程序中(更准确地说是在线程中)无序执行没有问题。如果存在并发(两个或多个线程并行运行),例如使用软件互斥锁,这只会导致问题。

带有mfence(或lfencesfence 在特殊情况下)的障碍可以帮助 平台。它们指示处理器此时不会发生乱序执行。这些是汇编指令,所以在 C 中你必须编写

asm volatile("mfence");

或使用相应的本能。

另一个问题可能是编译器对指令的排列方式与程序中的指令不同或进行了其他优化(例如,根本不将值写入内存,而是将它们保存在寄存器中)。为防止这种情况发生,必须在您用于软件互斥锁的变量中使用关键字 volatile

【讨论】:

  • 这是否意味着只要存在可以被多个线程同时读写的资源,我们就必须“始终”使用操作系统为该部分代码提供的互斥锁以避免意外后果?
  • 或者你使用mfencevolatile或者原子访问。但是,只有当一个线程要对另一个线程对变量所做的更改做出反应时,才需要这样做。
最近更新 更多