[英]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.