C#中的信號量---Semaphore


Semaphore是System.Threading下的類,限制可同時訪問某一資源或資源池的線程數。

 

常用構造方法

https://msdn.microsoft.com/zh-cn/library/e1hct27h(v=vs.110).aspx

public Semaphore(
	int initialCount,
	int maximumCount
)

參數

initialCount
Type:  System.Int32

可以同時授予的信號量的初始請求數。

maximumCount
Type:  System.Int32

可以同時授予的信號量的最大請求數。

 

 示例代碼

class Program
    {
       static Semaphore sema = new Semaphore(1,1);
      
        static void Main(string[] args)
        {
            for (int i = 0; i < 3; i++)
            {
                var thread = new Thread(Test) { Name = $"Thread{ i }" };
                thread.Start();
            }
            Console.ReadKey();
        }


        static void Test()
        {
            sema.WaitOne();
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
                Thread.Sleep(1000);
            }
            sema.Release();
            Console.ReadKey();
        }
    }

代碼說明:

static Semaphore sema = new Semaphore(1,1);

聲明一個信號量,指示控制的資源初始和最大線程並發數為1

sema.WaitOne();
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
Thread.Sleep(1000);
}
sema.Release();

使用以上兩個方法控制資源,某個線程執行sema.WaitOne()方法時,若有其他線程已經占用資源,此方法將阻塞,直到,其他線程釋放,即調用sema.Release();方法

執行效果如下:

同一段時間內,只有一個線程進入共享資源中。

 

以下是最大並發數為2的執行效果:

static Semaphore sema = new Semaphore(2,2);

同一段時間內,有兩個線程進入了貢獻資源中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM