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

Posted

技术标签:

【中文标题】是否可以通过单字操作原子读取双字?【英文标题】:Is it possible to atomically read a double word with single-word operations? 【发布时间】:2012-01-26 01:29:21 【问题描述】:

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

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

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

我记得,解决办法是先读最高的词,然后再读最低的词。然后再次读取最高的单词,如果没有变化,则认为该值一致。

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

    然后该算法将读取高位部分(并获得0)。 现在,在我们的算法读取下一部分之前,另一个参与者将值更改为 22。 然后我们读取低位数字,2; 但是,讨厌的麻烦制造者再次更改了值,并使其成为03。 我们阅读了高位部分,它是0。我们读取02,算法认为值一致;但实际上,从来都不是02

我对这个难题的回忆是否正确?是不是我记错的解决方案?

【问题讨论】:

【参考方案1】:

该解决方案听起来像是用于值不断增加或减少而不是任意变化的系统。

通过在值递增的系统中读取高/低/高,您可以确定该值没有换行,例如(对于一位数字)0,9 变为 1,0。代码类似于:

read high into reg2                 # Get high value.
set reg0 to reg2 minus 1            # Force entry in to loop.
while reg0 is not equal to reg2:    # Repeat until consecutive highs are same.
    set reg0 to reg2                    # Transfer high.
    read low into reg1                  # Read low.
    read high into reg2                 # Read next high.

# Now reg0/reg1 contains high/low.

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

【讨论】:

以上是关于是否可以通过单字操作原子读取双字?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文本语料库中删除特定的单字组,但仍保留该单词的双字组?

C中的字和双字整数

SDRAM单字写操作

2018/10/03-字符串指令(重复指令操作数据缓冲区指令)rep与movx指令-《恶意代码分析实战》

int64的读写操作是否具有原子性质

AtomicLong可以被原子地读取和写入的底层long值的操作