回覆列表
-
1 # 使用者4689965211263
-
2 # 使用者6765375850720
線上程裡寫個while迴圈 用個變數控制 不想要時把變數變成false,否則它會一直執行
比如:
while(flag)
{
插入方法();
Thread.Sleep(2000);// 間隔兩秒
修改方法();
}
線上程裡寫個while迴圈 用個變數控制 不想要時把變數變成false,否則它會一直執行
比如:
while(flag)
{
插入方法();
Thread.Sleep(2000);// 間隔兩秒
修改方法();
}
不會出現問題的,具體過程如下。
假設執行緒開始執行在core1上,對記憶體x將舊值b更改成新值a,在完成mov [x], a指令時,a這個值至少已經寫到core1上的store buffer裡面了。
執行緒要被遷移到core2,那必須是它被搶佔,或主動讓出cpu,或者主動睡眠才可以發生遷移到core2. 但不管什麼情況,它必須在core1執行完schedule函式之後,才會發生遷移。
而schedule函式有以下一段程式碼:
注意上述最後兩條語句,它會產生一個mb,意味著執行到mb之後,剛才將x修改為a的操作,會從store buffer寫到L1 Cache,並且會將invalid message傳送到其它核的invalid queue上。
之後執行緒才被排程出來了。
而執行緒被core2遷移過來時,它要執行,也必須是另一個執行緒執行schedule之後才能輪到該執行緒執行。同樣,scheuld函式在core2執行時,因為有mb語句,它必須將本core2的invalid queue上的請求應用到本核的L1 Cache上,才能往前執行,此時Core2上L1 Cache上x的值狀態變為invalid。
所以執行緒在core2執行完schedule後,還沒有返回到使用者態執行,那此時Cache情況如下:
Core1: x值,有效,為a,Exclusive狀態
Core2: x值,無效, 因為收到core1的invalide message並應用到本Cache
然後執行緒執行到使用者態時,訪問x變數,本地cache是invalid,會發送讀cache請求到core1,core1返回x的值為a給core2,此時core1/core2對x地址的狀態均為Share。
所以Linux已 處理好程序排程與Cache的關係了。