C#多線程編程之:使用Semaphore類限制資源並發訪問數

來源:互聯網
上載者:User

  考慮這樣的一個情境:一個停車場的只含一定數量的停車位,只有當停車場中還有空位時,停車場的入口才會開啟。C#提供了Semaphore類來處理這種情境。Semaphore類可以在構造時指定資源數量,使用WaitOne方法等待一個資源,使用Release方法釋放一個資源。範例程式碼:

using System;
using System.Threading;

namespace ProcessTest
{
class Program
{
static Semaphore semaphore;

static void Main(string[] args)
{
//建立一個限制資源類
//資源數為5,開放資源數為2
//主線程自動佔有3個資源
semaphore = new Semaphore(2, 5);

//開啟3個線程,讓它們競爭剩餘的2個資源
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(new ThreadStart(WorkerProc));
t.Name = "Thread" + i;
t.Start();
Thread.Sleep(30);
}

System.Console.ReadKey();
}

static void WorkerProc()
{
for (int i = 0; i < 3; i++)
{
//等一個資源訊號
semaphore.WaitOne();
Console.WriteLine(Thread.CurrentThread.Name + ": Begin");
Thread.Sleep(200);
Console.WriteLine(Thread.CurrentThread.Name + ": End");
//釋放資源
semaphore.Release();
}
}
}
}

  程式首先建立一個Semaphore類,該類指定資源數為5,但只釋放出2個資源給3個線程競爭,其它3個資源被主線程所佔用。子線程首先等待一個資源,擷取到資源後,休眠200ms,隨後釋放資源。

  這段程式的輸出如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.