2010-08-11 68 views
3

我不確定此問題..使用Array with multiple reader threads + writer

使用int []數組。 如果在我的應用程序中,線程A在線程B寫入相同的數組元素時讀取數據,那麼所有數據都會保留嗎?

我寧願在閱讀時也沒有一個同步塊 - 這是在一個Web服務中使用的,所以我將無法並行服務多個客戶端。

謝謝。

Olivier

回答

0

需要同步由多個線程訪問的共享資源。

由於數組不是線程安全的,所以您需要自己管理它。

1

不,您需要使用鎖定塊來確保沒有人嘗試讀取數組,而其他進程正在寫入數據。否則,您可能會遇到問題。

這實際上是在C#很簡單,你可以這樣做:

// declare an object to use for locking 
Object lockObj = new Object(); 

// declare the array 
int[] x = new int[5]; 

// set the array value (thread safe operation) 
public void SetArrayVal(int ndx, int val) 
{ 
    if (ndx < 0 || ndx >= x.Length) 
    { 
     throw new ArgumentException("ndx was out of range", ndx); 
    }  
    lock (lockObj) 
    { 
     x[ndx] = val; 
    } 
} 

// get the array value (thread safe operation) 
public int GetVal(int ndx) 
{ 
    if (ndx < 0 || ndx >= x.Length) 
    { 
     throw new ArgumentException("ndx was out of range", ndx); 
    }  
    lock (lockObj) 
    { 
     return x[ndx]; 
    } 
} 

我不會太在乎的性能這裏,以確保您獲得線程saftiness正確的,這是關鍵。

+0

感謝您的片段!而你對性能和線程安全性的評論 - 我的確關心性能。 – user338421 2010-08-11 13:48:10

+0

@osteinme - 不客氣:)。如果數據損壞,性能無關緊要,所以如果您需要線程安全性,則必須確保數據訪問是同步的。我真的懷疑,除非你每秒做數百萬次操作,否則性能會受到很大的影響。 – dcp 2010-08-11 14:10:57

0

您需要鎖定來自多個併發線程的數組訪問權限。最簡單的方法是隻允許使用getters/setter訪問你的數組,然後在這些數組中加入一些鎖定代碼。

1

如果你正在做的比寫多讀,然後用ReaderWriterLockSlim以提高性能(雖然它可能使你的代碼更詳細。)

如果你擔心阻止您的客戶端線程,那麼也許你可以將這些操作排成一個線程安全隊列。說實話,除非你對每個請求採取多重鎖定,否則你不可能等到這些鎖定時間足夠長時間才能讓網站的人類用戶注意到。處理高吞吐量和低延遲時,這種性能影響更爲顯着。

+0

謝謝,非常有用。不幸的是我仍然處於2.0環境,所以會使用ReaderWriterLock,但是當我們升級時我們需要使用slim。 – user338421 2010-08-11 13:43:51