2012-07-11 95 views
0

我的第一個想法是關於SpinLockConcurrent Collections 鎖將在我測試,但它更昂貴的工作在這裏!鎖添加到集合

這裏的過程基於並行編程。並行任務多於一個。

在SpinLock版本中,我偶爾會遇到一個類似於"Index out of range"的隨機錯誤。

我寫的SpinLock版本無法完成我想要的工作,可以對其進行任何更改以使其工作?或者它是否與這種情況完全相關?

任何信息?

它有更好的選擇嗎?

這是我做過什麼:

 lock (lckRelatz) 
    { 
     relatz.Add(st); 
    } 

這裏是自旋鎖版本 - 這是並行運行的方法中:

 SpinLock spinLk = new SpinLock(); 
     bool gotLock = false; 
     try 
     { 
      spinLk.Enter(ref gotLock); 
      relatz.Add(st); 
     } 
     finally 
     { 
      if (gotLock) 
       spinLk.Exit(); 
     } 

回答

2

好像你正在創建新的SpinLock爲每個線程。這實際上不會鎖定任何東西。你需要有一個SpinLock並使用你的所有線程。

但是使用併發集合是更好的解決方案。它們經過高度優化,使用它們意味着您不必擔心自己的所有鎖定。

+0

很好的答案,似乎你得到了關鍵,哪個集合將在這裏工作? BlockingCollection?關於鎖的創建我認爲,在我的代碼編輯中,它以幾種不同的方式做了它,我認爲增加了像你之前所說的但隨時間而改變並且不知道確切問題。 – Sypress 2012-07-11 08:07:18

+0

這取決於你想要什麼,但'BlockingCollection'或'ConcurrentQueue'是最有用的。如果你不需要阻塞,'ConcurrentQueue'應該足夠了。 – svick 2012-07-11 09:13:49