.net 4.0 中對多執行緒新特性(轉)
在4.0之前如果需要在多執行緒環境下操作集合型別的物件往往需要額為每種操作新增比較複雜的鎖機制才能保證每個執行緒對資源的訪問安全,在4.0的Collection名稱空間下面又多了一個新的名稱空間Concurrent,在這個名稱空間下面增加了幾個非常有用的執行緒安全的類:
BlockingCollection
ConcurrentBag
ConcurrentDictionary
ConcurrentQueue
ConcurrentStack
OrderablePartitioner
Partitioner 提供針對陣列、列表和可列舉項的常見分割槽策略。
Partitioner
通一個簡單的例子可以非常容易的來應用這些特性
class Program
{
static ConcurrentDictionary<int, int> dict = new ConcurrentDictionary<int, int>();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
var thread = new Thread(new ThreadStart(Action));
thread.Start();
}
Console.Read();
}
static void Action()
{
var rd = new Random();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(rd.Next(1, 5));
var k = dict.TryAdd(i, i);
Console.WriteLine("Thread {0} add {1} {2}", Thread.CurrentThread.ManagedThreadId, i, ok ? "success" : "fail");
}
}
}
程式輸出如下:
Thread 11 add 0 success
Thread 11 add 1 success
Thread 12 add 0 fail
Thread 13 add 0 fail
Thread 11 add 2 success
Thread 12 add 1 fail
Thread 14 add 0 fail
Thread 12 add 2 fail
Thread 13 add 1 fail
…
從輸出結果我們看到在多執行緒競爭的情況下ConcurrentDictionary能夠很好的處理鎖競爭的問題。
生產消費模式在多執行緒中是非常常見的一種模式了,在4.0之前需要一套比較複雜的讀寫鎖來處理處理併發資源競爭的問題,在4.0中藉助BlockingCollection
static void Main(string[] args)
{
TestCase.Test();
Console.Read();
}
class TestCase
{
static ConcurrentBag
public static void Test()
{
var produce = new Thread(new ThreadStart(Produce));
var consume = new Thread(new ThreadStart(Consume));
produce.Start();
consume.Start();
}
static void Produce()
{
int index = 0;
while (true)
{
if (_bag.IsEmpty)
{
string productName = "Product " + index.ToString();
_bag.Add(new Product() { Name = productName });
Console.WriteLine("Produce Product {0} ", productName);
index += 1;
}
Thread.Sleep(1000);
}
}
static void Consume()
{
while (true)
{
if (!_bag.IsEmpty)
{
Product item;
if (_bag.TryTake(out item))
{
Console.WriteLine("Consume Product {0} " , item.Name);
}
}
Thread.Sleep(1000);
}
}
}
class Product
{
public string Name { get; set; }
}
程式輸出如下:
Consume Product Product 0
Produce Product Product 1
Consume Product Product 1
Produce Product Product 2
Consume Product Product 2
Produce Product Product 3
Consume Product Product 3
Produce Product Product 4
Consume Product Product 4
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-670846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- .NET 多執行緒執行緒
- Redis 6.0 新特性-多執行緒連環13問!Redis執行緒
- c++11 新特性實戰 (一):多執行緒操作C++執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- .NET下多執行緒初探執行緒
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java程式中的多執行緒(2)(轉)Java執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- 實戰.Net多執行緒(一)執行緒
- 實戰.Net多執行緒(二)執行緒
- 實戰.Net多執行緒(三)執行緒
- 實戰.Net多執行緒(四)執行緒
- 關於多執行緒(轉)執行緒
- win32多執行緒和C++11多執行緒對比Win32執行緒C++
- .NET多執行緒程式設計(4):執行緒池和非同步程式設計 (轉)執行緒程式設計非同步
- 多執行緒和多執行緒同步執行緒
- Muduo 多執行緒模型對比執行緒模型
- Qt 中多執行緒對應的訊號槽QT執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- Java中的多執行緒Java執行緒
- Android《多執行緒-中》Android執行緒
- RxJava 中的多執行緒RxJava執行緒
- Qt 中的多執行緒QT執行緒
- 多執行緒中的ManualResetEvent執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- Asp.Net 4.0 新特性之 使用自定義OutputCache Provider(轉)ASP.NETIDE
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒