【问题标题】:Program order in concurrent piece of code并发代码中的程序顺序
【发布时间】:2019-01-12 02:37:13
【问题描述】:

鉴于这段代码:

int x = 0;
co x:= x + 1 || x := x - 1 oc

显然可能的值为x = {0, -1, 1}

我试图了解这是如何发生的,我读到了原子语句,当它们发生时它们才会发生。

书中给出的例子是我们可以将语句x := x + 1分解成原子语句。

READ X (R1) INC WRITE(W1)

x := x - 1 进入:

READ X (R2) DEC WRITE (W2)

它说INC WRITEREAD inc 都表现得好像是原子的,我真的不明白为什么做出这样的假设是安全的?

那么,显然这个程序命令返回值 -1 : R1 -> R2 -> W1 -> W2 我不明白为什么?

据我了解,我们似乎正在读取 x 的值,然后再次读取它,然后将其递增 1,然后将其递减 1,这不应该等于 0 吗?

感谢您的帮助。

【问题讨论】:

    标签: concurrency parallel-processing


    【解决方案1】:

    并发的问题是你无法控制并发访问的顺序。所以我们做出以下假设:
    - x 是由不同线程访问的全局变量
    - x++ 和 x-- 由独立线程执行。

    如您的书中所述,对共享 var 执行读-修改-写是一个三步过程:
    1/ 将 var 读入处理器 reg
    2/ 修改处理器注册
    3/ 将处理器 reg 写入寄存器
    这些单独的动作中的每一个都对应于一条处理器指令,因此是原子的。但是全局的 read-modify-write 操作不是并且可以被其他并发操作拆分。

    现在考虑并发操作

     Thread A                          Thread B
     1/ read x->regA                   a/ read x->regB
     2/ regA++                         b/ regB-- 
     3/ write regA->x                  c/ write regB
    

    在线程内,操作顺序 123 或 abc 将得到尊重,但在线程 A 和 B 之间,任何相对顺序都是可能的。

    对于 123abc,我们得到了预期的结果。 x 由线程 A 变为 1,然后由线程 B 读取,递减,最后 x=0
    abc123也一样

    但其他排序会导致不同的结果。 例如:1a2b3c

     Thread A                          Thread B
     1/ read x->regA=0                   
                                       a/ read x->regB=0
     2/ regA++=1                       
                                       b/ regB--=-1 
     3/ write regA->x=1
                                       c/ write regB->x=-1
    

    最后是 x=-1。

    但是对于 1abc23,我们将得到 x=1。

     Thread A                          Thread B
     1/ read x->regA=0                   
                                       a/ read x->regB=0
                                       b/ regB--=-1 
                                       c/ write regB->x=-1
     2/ regA++=1    
     3/ write regA->x=1                   
    

    由于所有订单都可以到达,结果将是\in{-1,0,1}

    获得确定性结果的唯一方法是使用原子读-修改-写指令。所有现代处理器都有办法做到这一点(获取和添加或加载链接/存储条件),在这种情况下,不能拆分序列 123 或 abc。唯一可能的排序将是 123abc 或 abc123,两者都将执行 x=0 的确定性结果。

    【讨论】:

    • 非常感谢,你的解释很有道理,我终于看懂了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2010-11-10
    • 2017-03-15
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多