Lession 2 : 共享資料的存取(Sharing Data)(p.387)
防止資料衝突(Avoiding Collisions)
- 在多個執行緒同時共用同個全域變數執行時,會發生重覆存取的狀況
生活範例 :
假設在Server上有個 Word 檔,希望3個人(A,B,C)在上面簽名,
命令一發出去,3個人跑來要簽名,A 很快的取得頭籌搶先簽到名,
所以在該檔上,有了 A 的簽名,再來 B 也很快的把 Word 檔讀出去要簽名,
此時,C 也把檔案讀了出去,當 B 簽好名,把 Word 檔存了進去,
進而,C 也簽好了,把他的 Word 檔存了進去。
這時候發生了個狀況,發現,上面居然沒有 B 的簽名。
因為,B 簽名的那個檔案,被 C 的檔案蓋掉了。
這就是該本課的重點,教導如何將這些全域的資料鎖定(只有單一執行緒能讀取)
單一數值變數適用(p.390) :
- Interlocked Static Methods
- Add : 將兩個64位元的整數相加,並以總合取代第一個整數
- Decrement :遞減特定變數並將其儲存
- Exchange : 將平台特定的控制代碼或指標設定為指定值,然後傳回
- Increment : 遞增特定變數並將其儲存
- Read :傳回64位字的值
- 以上皆為「不可部份完成」(鎖定)
- 效能比較好(如果只做遞增減運算)
程式範例
區域型適用 :
- lock(簡單型)(p.394)
- Monitor Static Methods(進階型)(p.395)
- Enter :取得指定物件的獨佔鎖定
- Exit :釋出指定物件的獨佔鎖定
- TryEnter :嘗試取得指定物件的獨佔鎖定(在指定時間內)
- Wait :釋出物件的鎖定,並且封鎖執行緒,直到此執行緒重新取得鎖定
程式範例
Understanding Deadlocks(p.396)
- 由於要執行的程式,被鎖定,而使程式僵在那
- 可利用 Monitor.TryEnter 方法,並設定鎖定時間來解決
程式範例
沒有留言:
張貼留言