同步:Interlocked 與 Array 的兼容性

Posted on 2007-08-19 16:25  夏子乂  阅读(210)  评论(0)    收藏  举报

今天整理代碼的時候,發現一個比較有趣的地方。

衆所周知,在多綫程存取的時候需要一些同步的機制。.net 提供了幾种不同的方式:Monitor (即 lock 關鍵詞),Interlocked 原子操作,以及 Mutex 等。而在同步操作相對簡單的情況下,我是比較傾向于使用 Interlocked,原因是其性能非常好。

在我的代碼中,有一個性能計數器。因爲項目挺多,所以我使用了一個 int[] 數組儲存計量。問題是,當時因爲不清楚 Interlocked 與 Array 的兼容性,我使用了 ReaderWriterLock 進行同步處理。例如:

m_oLock.AcquireWriterLock();
try
{
    m_oCounters[Counters.Total]
++;
}
finally
{
    m_oLock.ReleaseWriterLock();
}


很明顯,這是一個比較愚蠢的方式……後來,在查閲 IL 的時候,發現 Interlocked.Increment 方法,需要一個 ref 參數,而 Array 的 IL 中,就有一個 ldelema 的操作碼。所以,Interlockded 與 Array 是互相兼容的。因此,上面的代碼其實可以寫成:

Interlocked.Increment(ref m_oCounters[Counters.Total]);


就可以了。而且性能上要好很多。