内存 0x100 和 0x104 是两个 32 位计数器。它们代表一个 64 位定时器并且不断递增。
如何正确读取两个内存地址并将时间存储为 64 位整数?
一个不正确的解决方案:
x = High
y = Low
result = x << 32 + y
(程序可以换出同时低位溢出...)
附加要求:
仅使用 C,无汇编
总线是 32 位的,所以无法在一条指令中读取它们。
您的程序可能会随时切换上下文。
没有可用的互斥体或锁。
一些高层次的解释是可以的。不需要代码。谢谢!
最佳答案
这是我从 David L. Mills 学到的,谁将它归因于 Leslie Lamport:
- 将定时器的上半部分读入H。
- 将定时器的下半部分读入L。
- 再次将定时器的上半部分读入H'。
- 如果 H == H' 则返回 {H, L},否则返回 1。
假设计时器 自身 自动更新,那么这肯定会起作用——如果 L 在步骤 1 和步骤 2 之间的某处溢出,那么 H 将在步骤 1 和步骤 3 之间递增,并且测试在第 4 步将失败。
关于c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162673/