volatile禁止指令重排 C 多線程有必要加volatile么?
C 多線程有必要加volatile么?1. Volatile與多線程無關(guān)。2添加volatile不會使錯誤的程序正確,刪除volatile不會使正確的程序錯誤。如果你愿意,你可以加上這個東西。無論如
C 多線程有必要加volatile么?
1. Volatile與多線程無關(guān)。2添加volatile不會使錯誤的程序正確,刪除volatile不會使正確的程序錯誤。如果你愿意,你可以加上這個東西。無論如何,它將沒有其他影響,除了減慢你的程序。三。除了在處理硬件時有用外,volatile唯一適用的地方是與信號相關(guān)的代碼,例如:#include<unistd。H>#包含<信號。H>#包括<stdio。H>int*foo=nullvoid signalhandler(int x){*foo=20}int main(){//volatile int bar=10 int bar=10 int Baz=15 foo=&Baz foo//foo現(xiàn)在指向bar,希望。。。Signal(SIGINT,sighandler)sleep(10)printf(%dn“,bar)}
(我知道這個程序是UB,我只想解釋這個問題)如果沒有volatile,編譯器會假設(shè)bar的值保持不變。按ctrl-c時,程序?qū)⑤敵?0。
volatile關(guān)鍵字在Java中有什么作用?
Volatile是為了防止指令重新排序以確??梢娦?/p>
對于JVM級別,是為了防止編譯器重新排序
同時,對于某些CPU,它們會通過緩存鎖或線程來解決緩存可見性
但是,目前很多CPU已經(jīng)過優(yōu)化,由于cache一致性MESI會帶來性能開銷,因此采用storebuffer機制進行異步處理,這種機制會導致指令的無序執(zhí)行。這會導致可見性問題。
然后volatile將在CPU級別增加內(nèi)存屏障,以解決由CPU無序執(zhí)行引起的可見性問題