此為核心鎖,和之前觸發函式不同這題用到簡單的邏輯,故講解一下。進入 spinlock前若 lock_factor 比 1 大時線程可以向下執行;若小於等於 0 則會進入無窮迴圈,也就是等待互斥釋放,unlock 會把 lock_factor 加 1。當另一個線程遇到 lock 函式時,新線程因為『- -』已經把 lock_factor 設為 -1,如此當然互斥等待,等原線程 + + 後 lock_factor 變成 0 會跳出 do-while 迴圈,如此即實現核心鎖。(前面說小於等於 0 則會進入無窮迴圈,現在又說lock_factor 變成 0 會跳出 do-while 迴圈,前後矛盾)。cnt 需告成 volatile 避免被優化存取不到固定記憶體,若不使用核心鎖兩線程會交錯執行每次出來的結果都不一樣,使用核心鎖可確保一次只有一個線程能執行 cnt ++。
此圖是網路原作者的核心鎖函式,但我若用小於等於 0 另一線程會死鎖 (注意紅框),應該不是他的問題是我囫圇吞棗。
沒有留言:
張貼留言