簡體   English   中英

memory barrier 和 volatile 是否足以避免數據競爭?

[英]Is a memory barrier AND volatile ENOUGH to avoid a data race?

我想看看我是否被迫使用原子整數。

我有一個看起來與此類似的循環:

struct loop {
  volatile int loop_variable;
  volatile int limit;
}

for (int i = loop.loop_variable ; i < loop.limit ; loop.loop_variable++) {

}

然后另一個 thead 這樣做:

loops.loop_variable = loops.limit;

並發出 memory 屏障。

這個多線程安全嗎?

存在數據競爭的程序集在這些行之間:

// loop.loop_variable = loop.limit;
movl    4+loop.0(%rip), %eax                                                                                                                                                             
movl    %eax, loop.0(%rip)  

    // for (int i = loop.loop_variable ; i < loop.limit ; loop.loop_variable++)
    movl    loop.0(%rip), %eax                                                                                                                                                               
    movl    %eax, -4(%rbp)                                                                                                                                                                   
    jmp .L2                                                                                                                                                                                  
.L3:                                                                                                                                                                                         
    movl    loop.0(%rip), %eax                                                                                                                                                               
    addl    $1, %eax                                                                                                                                                                         
    movl    %eax, loop.0(%rip)                                                                                                                                                               
.L2:                                                                                                                                                                                         
    movl    loop.0(%rip), %eax                                                                                                                                                               
    cmpl    $99999, %eax                                                                                                                                                                     
    jle .L3                                                                                                                                                                                  
    movl    $0, %eax  

之間可能存在數據競爭

movl    loop.0(%rip), %eax                                                                                                                                                               
        addl    $1, %eax                                                                                                                                                                         
        movl    %eax, loop.0(%rip)

因為它是增加 loop_variable 的三個指令。 但只有一個將循環變量覆蓋到極限。

這個多線程安全嗎?

不。

鑒於

loops[0].loop_variable = loops[0].limit;
< memory barrier >

在一個線程中,memory 屏障不會阻止int i = loop.loop_variable讀取不確定值或loop.loop_variable++在另一個線程中產生無意義的結果。 其他線程仍然可能“看到”對loops[0].loop_variable的更改。 或部分改變。

memory 障礙只是在事后強加一致性——它事先沒有做任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM