C#中的ConcurrentExclusiveSchedulerPair類

2023-09-05 12:01:39

為什麼使用ConcurrentExclusiveSchedulerPair?

現實生活中的例子是一個停車場的入口和出口,多輛車可以同時進入和離開停車場,但是隻有一個車輛可以進入或離開一次。

這時候就需要保證同時只有一個車輛能夠存取停車場的入口或出口,避免出現多輛車同時進出停車場的競態條件和導致車輛堵塞的問題。

使用ConcurrentExclusiveSchedulerPair可以將需要獨佔存取的停車場入口和出口操作加入ExclusiveScheduler中,從而保證在任何時候都只有一個車輛能夠進入或離開停車場,避免了競態條件和資料不一致的情況。

ConcurrentExclusiveSchedulerPair類介紹

ConcurrentExclusiveSchedulerPair類是.NET Framework 4.0中引入的一種新的多執行緒程式設計工具,它提供了兩個排程器,一個是並行排程器(ConcurrentScheduler),另一個是獨佔排程器(ExclusiveScheduler)。通過這兩個排程器,可以實現多個任務的並行執行和互斥存取。

以下是建立ConcurrentExclusiveSchedulerPair物件的基本程式碼:

var pair = new ConcurrentExclusiveSchedulerPair();

在上述程式碼中,我們建立了一個ConcurrentExclusiveSchedulerPair物件。這個物件包含了兩個排程器:並行排程器和獨佔排程器。

並行排程器

並行排程器是一種可以讓多個任務並行執行的排程器。在並行排程器中,任務可以同時執行,而不需要等待其他任務完成。

以下是使用並行排程器來執行任務的範例:

var pair = new ConcurrentExclusiveSchedulerPair();
var concurrentScheduler = pair.ConcurrentScheduler;

Task.Factory.StartNew(() =>
{
    // 任務執行的程式碼
}, CancellationToken.None, TaskCreationOptions.None, concurrentScheduler);

在上述程式碼中,我們獲取了ConcurrentExclusiveSchedulerPair物件的並行排程器,並使用Task.Factory.StartNew方法來建立一個任務,並使用並行排程器來排程任務的執行。

獨佔排程器

獨佔排程器是一種可以讓任務獨佔執行的排程器。在獨佔排程器中,只有一個任務可以執行,其他任務必須等待前一個任務完成後才能執行。

以下是使用獨佔排程器來執行任務的範例:

var pair = new ConcurrentExclusiveSchedulerPair();
var exclusiveScheduler = pair.ExclusiveScheduler;

Task.Factory.StartNew(() =>
{
    // 任務執行的程式碼
}, CancellationToken.None, TaskCreationOptions.None, exclusiveScheduler);

在上述程式碼中,我們獲取了ConcurrentExclusiveSchedulerPair物件的獨佔排程器,並使用Task.Factory.StartNew方法來建立一個任務,並使用獨佔排程器來排程任務的執行。

下面是完整案例

var pair = new ConcurrentExclusiveSchedulerPair();

var concurrentTaskFactory = new TaskFactory(pair.ConcurrentScheduler);
var exclusiveTaskFactory = new TaskFactory(pair.ExclusiveScheduler);
// 排程獨佔任務
exclusiveTaskFactory.StartNew(() =>
{
	Console.WriteLine("執行緒:{0}上正在執行獨佔任務1", Thread.CurrentThread.ManagedThreadId);
	Thread.Sleep(1000);
});
exclusiveTaskFactory.StartNew(() =>
{
	Console.WriteLine("執行緒:{0}上正在執行獨佔任務2", Thread.CurrentThread.ManagedThreadId);
	Thread.Sleep(1000);
});

// 等待所有任務完成
Task.WaitAll(
concurrentTaskFactory.StartNew(() =>
{
	Console.WriteLine("並行任務3線上程:{0}上執行", Thread.CurrentThread.ManagedThreadId);
}),
exclusiveTaskFactory.StartNew(() =>
{
	Console.WriteLine("獨佔任務3正線上程:{0}上執行", Thread.CurrentThread.ManagedThreadId);
	Thread.Sleep(1000);
}));

輸出結果

執行緒:15上正在執行獨佔任務1

執行緒:15上正在執行獨佔任務2

獨佔任務3正線上程:15上執行

並行任務3線上程:15上執行

結論

總之,使用 ConcurrentExclusiveSchedulerPair 的目的是為了保證在高並行情況下,多個任務對共用資源進行讀寫操作時不會產生競態條件和資料不一致的問題。這可以提高應用程式的穩定性和可靠性。

作者 => 百寶門瞿佑明

原文地址:https://blog.baibaomen.com/c中的concurrentexclusiveschedulerpair類/