Saturday, June 12, 2010

InterlockedCompareExchange 鎖上 比較 交換

我決定在Echeneidae IDS上使用一種全新的Queue架構,增加Queue Manager的彈性與效能(諷刺的是,儘管我不斷在Python C Extension部分使用各種極端的方法提升效能,Python本身其實才是效能的最大問題)

在這個架構中,我決定要盡量減少許多封裝型的同步API(Synchronization API)的使用
e.g.

原因在於它們往往需要通過Windows內部許多的機制來解決同步問題,如此一來需要占用一小段時間

為了使用簡單的同步API達成同步問題,我嘗試大量採用InterlockedXXXXXX系列API
它們透過CPU的指令集中的lock對總線進行控制,讓CPU在執行這行指令時,不會被打斷(不管是中斷還是多核CPU問題),解決同步問題

我認為InterlockedCompareExchange給我不少幫助,它可以先將目標資料跟比對資料比對後,如果相等,則將取代資料存入目標資料中,反之沒有動作

如此一來,當兩個Thread會同時搶著修改一個資源時,可以在資源加入一個Status標誌,表示當前是否有人已經先占用,如果發現它等於未被人占用狀態值,則將它修改為占用狀態值,並且進行處理,InterlockedCompareExchange剛好可以將上述兩個動作合在一個指令完成,並且透過lock的保護,確保不會兩個Thread不會同時檢查跟修改Status標誌


No comments:

Post a Comment