是否可以通过单字操作原子读取双字?

时间:2012-01-26 01:29:21

标签: language-agnostic atomicity

我记得在某些时候,我看到了一个编程挑战,人们被要求用单字操作原子地读取双字。

现在,在我们继续之前,做一些澄清:

  • 单个字是一个具有可由某个处理器处理的自然位数的单元(例如,32位处理器为32位);
  • 双字是单个字大小的两倍(因此处理器指令不能立即处理);
  • 通过 atomic ,我的意思是结果数据应该与某个时刻的值一致,我们可以假设没有任何实现或硬件细节会妨碍。

我记得,解决方案是读取最高的单词,然后读取最低的单词。然后再次读取最高的单词,如果它没有改变,那么该值可以被认为是一致的。

但是,我不确定了。假设我们有两位数01

  1. 然后算法将读取高部分(并获得0)。
  2. 现在,在我们的算法读取下一部分之前,另一个actor将值更改为22
  3. 然后我们读取低位数2;
  4. 但是,麻烦的麻烦制造者再次更改了值,并使其成为03
  5. 我们读了很高的部分,它是0。我们读了02,算法认为值一致;但实际上,它从来都不是02
  6. 我对这个难题的回忆是否正确?这是我不记得的解决方案吗?

1 个答案:

答案 0 :(得分:5)

这个解决方案听起来像是一个价值不断增加或减少的系统,而不是随意改变。

通过在值递增的系统中读取高/低/高,可以确保该值未包裹,例如(对于一位数字)0,9变为{{1 }}。代码类似于:

1,0

在值可以任意改变的任何其他情况下,您需要对单独的单词进行某种测试和设置操作,有效地实现低级互斥锁以保护双字。