多核時代.NETFramework4中的並行程式設計9—執行緒安全集合類
在.Net 4中,新增System.Collections.Concurrent 名稱空間中提供多個執行緒安全集合類,這些類提供了很多有用的方法用於訪問集合中的元素,從而可以避免使用傳統的鎖(lock)機制等方式來處理併發訪問集合.因此當有多個執行緒併發訪問集合時,應首先考慮使用這些類代替 System.Collections 和 System.Collections.Generic 名稱空間中的對應型別.具體如下:
1. ConcurrentQueue
表示執行緒安全的先進先出(FIFO)佇列.程式碼如下:
ConcurrentQueue<int> sharedQueue = new ConcurrentQueue<int>();
for (int i = 0; i < 1000; i++)
{
sharedQueue.Enqueue(i);
}
int itemCount = 0;
Task[] tasks = new Task[10];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = new Task(() =>
{
while (sharedQueue.Count > 0)
{
int queueElement;
bool gotElement = sharedQueue.TryDequeue(outqueueElement);
if (gotElement)
{
Interlocked.Increment(ref itemCount);
}
}
});
tasks[i].Start();
}
Task.WaitAll(tasks);
Console.WriteLine(“Items processed:{0}”, itemCount);
Console.WriteLine(“Press Enter to finish”);
Console.ReadLine();
該類有兩個重要的方法用來訪問佇列中的元素.分別是:
Ø TryDequeue 嘗試移除並返回位於佇列頭開始處的物件.
Ø TryPeek嘗試返回位於佇列頭開始處的物件但不將其移除.
現在,在多工訪問集合元素時,我們只需要使用TryDequeue或TryPeek方法,就可以安全的訪問集合中的元素了.
2. ConcurrentStack
表示執行緒安全的後進先出(LIFO)棧.它也有幾個有用的方法,分別是:
Ø TryPeek:嘗試返回棧頂處的元素,但不移除.
Ø TryPop: 嘗試返回棧頂處的元素並移除.
Ø TryPopRange: 嘗試返回棧頂處開始指定範圍的元素並移除.
在訪問集合中的元素時,我們就可以上述方法.具體程式碼例項於上面的ConcurrentQueue類似,就不重複了.
3. ConcurrentBag
實現的是一個無序的集合類.程式碼如下:
ConcurrentBag<int> sharedBag = new ConcurrentBag<int>();
for (int i = 0; i < 1000; i++)
{
sharedBag.Add(i);
}
int itemCount = 0;
Task[] tasks = new Task[10];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = new Task(() =>
{
while(sharedBag.Count>0)
{
int queueElement;
bool gotElement = sharedBag.TryTake(outqueueElement);
if (gotElement)
Interlocked.Increment(ref itemCount);
}
});
tasks[i].Start();
}
Task.WaitAll(tasks);
Console.WriteLine(“Items processed:{0}”, itemCount);
Console.WriteLine(“Press Enter to finish”);
Console.ReadLine();
該類有兩個重要的方法用來訪問佇列中的元素.分別是:
Ø TryTake 嘗試移除並返回位於佇列頭開始處的物件.
Ø TryPeek嘗試返回位於佇列頭開始處的物件但不將其移除.
4. ConcurrentDictionary
實現的是一個鍵-值集合類.它提供的方法有:
Ø TryAdd:嘗試向集合新增一個鍵-值
Ø TryGetValue:嘗試返回指定鍵的值.
Ø TryRemove:嘗試移除指定鍵處的元素.
Ø TryUpdate:嘗試更新指定鍵的值.
程式碼如下:
class BankAccount
{
public int Balance
{
get;
set;
}
}
static void DictTest()
{
BankAccount account = new BankAccount();
ConcurrentDictionary<object, int> sharedDict = newConcurrentDictionary<object, int>();
Task<int>[] tasks = new Task<int>[10];
for (int i = 0; i < tasks.Length; i++)
{
sharedDict.TryAdd(i, account.Balance);
tasks[i] = new Task<int>((keyObj) =>
{
int currentValue;
bool gotValue;
for (int j = 0; j < 1000; j++)
{
gotValue = sharedDict.TryGetValue(keyObj, outcurrentValue);
sharedDict.TryUpdate(keyObj, currentValue + 1, currentValue);
}
int result;
gotValue = sharedDict.TryGetValue(keyObj, outresult);
if (gotValue)
{
return result;
}
else
{
throw new Exception(String.Format(“No data item available for key {0}”, keyObj));
}
}, i);
tasks[i].Start();
}
for (int i = 0; i < tasks.Length; i++)
{
account.Balance += tasks[i].Result;
}
Console.WriteLine(“Expected value {0}, Balance: {1}”, 10000, account.Balance);
Console.WriteLine(“Press enter to finish”);
Console.ReadLine();
}
通過上述提供的安全類,我們可以方便的併發訪問集合中的元素,而不需要以前的Synchronized方法或者lock(SyncRoot)等處理方式.
本文轉自風車車 部落格園部落格,原文連結:http://www.cnblogs.com/xray2005/archive/2011/10/11/2206745.html,如需轉載請自行聯絡原作者
相關文章
- java中執行緒安全的集合Java執行緒
- Java併發-執行緒安全的集合類Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多核時代 .NET Framework 4 中的並行程式設計5---並行迴圈Parallel LoopFramework並行行程程式設計ParallelOOP
- C#並行,多執行緒程式設計並行集合和PLINQ的例項講解並行執行緒程式設計
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- Java執行緒安全的集合類:Map、List、SetJava執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- JUC之集合中的執行緒安全問題執行緒
- WRF WPS多核並行執行並行
- .Net 執行緒安全集合執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- C# 多執行緒,論多核時代愛恨情仇C#執行緒
- 保障執行緒安全的設計執行緒
- 併發程式設計與執行緒安全程式設計執行緒
- 程式設計思想之多執行緒與多程式(2):執行緒優先順序與執行緒安全程式設計執行緒
- objc系列譯文(2.4):執行緒安全類的設計OBJ執行緒
- java各種集合的執行緒安全Java執行緒
- 多執行緒-以前的執行緒安全的類回顧執行緒
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- C#集合類(HashTable, Dictionary, ArrayList)與HashTable執行緒安全C#執行緒
- 5天玩轉C#並行和多執行緒程式設計 —— 第二天 並行集合和PLinqC#並行執行緒程式設計
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- 如何設計並實現一個執行緒安全的 Map ?(下篇)執行緒
- 如何設計並實現一個執行緒安全的 Map ?(上篇)執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒程式設計執行緒程式設計
- 執行緒程式設計(一)執行緒程式設計
- 多核和多執行緒那些事執行緒
- 集合框架與執行緒安全解決框架執行緒
- 併發程式設計之執行緒安全性程式設計執行緒
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- java執行緒程式設計(一):執行緒基礎(轉)Java執行緒程式設計