我有一個Windows 7驅動程序,我想同步對變量的訪問。我可以使用InterlockedExchange嗎?兩個CPU核心上的InterlockedExchange
我目前對InterlockedExchange的理解是,InterlockedExchange是通過編譯器內在函數完成的。這意味着,讀取(InterlockedExchange返回舊值)並且寫入在一個時鐘週期內完成。只有當變量總是通過互鎖功能訪問時,互鎖功能纔是原子的。
但在這種情況下會發生什麼:
CPU1: InterlockedExchange(&Adapter->StatusVariable, 5);
CPU2: InterlockedExchange(&Adapter->StatusVariable, 3);
StatusVariable被寫在兩個CPU核心相同的時鐘週期。該函數是否注意到變量被訪問並將寫入推遲到一個不同的時鐘週期?或者是不確定變量在寫入後具有哪個值?變量是否也可能包含垃圾?
編輯:我在x86或x64上。
這裏沒有提到的重要一點是這些調用的返回值。使用互鎖的調用應該檢查返回的值。除非我誤認爲它是這樣的:可以說'StatusVariable'的初始值是2,然後(除非我錯了)那些調用中的一個將返回2,另一個將返回3或5,而兩次通話後的值分別爲5或3。哪個價值超出了你的控制範圍,而你應該根據舊的價值來採取行動 - 是否如預期的那樣,還是應該放棄/重試? (P.S.我可能是錯的。) – AnorZaken