2008年4月17日 星期四

Threading (Part 3)(4.17)

書刊:Application Development Foundation



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 方法,並設定鎖定時間來解決


程式範例


沒有留言: