如何在没有竞争条件的情况下将两个32位计数器读为64位整数

Wei*_*Shi 12 c embedded

存储器0x100和0x104是两个32位计数器.它们代表64位定时器并且不断递增.

如何正确读取两个内存地址并将时间存储为64位整数?

一个错误的解决方

x = High
y = Low
result =  x << 32 + y
Run Code Online (Sandbox Code Playgroud)

(该程序可以换出,同时低溢出...)

附加要求:
仅使用C,无汇编
总线为32位,因此无法在一条指令中读取它们.
您的程序可以随时切换上下文.
没有可用的互斥锁或锁.

一些高级别的解释是可以的.代码没有必要.谢谢!

hob*_*bbs 21

我从David L. Mills那里学到了这一点,他将其归功于Leslie Lamport:

  1. 将计时器的上半部分读入H.
  2. 将计时器的下半部分读入L.
  3. 再次将定时器的上半部分读入H'.
  4. 如果H == H'则返回{H,L},否则返回1.

假设定时器本身自动更新,那么这可以保证工作 - 如果L在步骤1和2之间某处溢出,那么H将在步骤1和3之间递增,并且步骤4中的测试将失败.

  • @Elf,关键是,你可能有一个"过时的"64位值,但仍然是正确的值. (4认同)