C# semaphore的使用-2

若是須要查看更多文章,請微信搜索公衆號 csharp編程大全,須要進C#交流羣羣請加微信z438679770,備註進羣, 我邀請你進羣! ! !編程

其實.NET中的信號量(Semaphore)是操做系統維持的一個整數。當整數位0時。其餘線程沒法進入。當整數大於0時,線程能夠進入。每當一個線程進入,整數-1,線程退出後整數+1。整數不能超過信號量的最大請求數。信號量在初始化的時候能夠指定這個整數的初始值。微信

 

System.Threading.Semaphore類的構造函數的兩個參數第一個就是信號量的內部整數初始值,也就是初始請求數,第二個參數就是最大請求數。dom

using System;
using System.Threading;

namespace ConsoleApp3
{
    class Program
    {
        static Semaphore semaphore;
        //當前信號量中線程數量
        static int count;
        //用於生成隨機數
        static Random r;
        static void Main()
        {
            r = new Random();
            //初始化信號量:初始請求數爲1,最大請求數爲3
            semaphore = new Semaphore(1, 3);
            //放出10個線程
            for (int i = 0; i < 5; i++)
                ThreadPool.QueueUserWorkItem(doo, i + 1);
            Console.ReadKey(true);
        }

        static void doo(object arg)
        {
            int id = (int)arg;
            PrintStatus(id, "等待");
            semaphore.WaitOne();
            PrintStatus(id, "進入");
            PrintCount(1);
            Thread.Sleep(r.Next(1000));
            PrintStatus(id, "退出");
            PrintCount(-1);
            semaphore.Release();

        }

        //輸出線程狀態
        static void PrintStatus(int id, string s)
        {
            Console.WriteLine("線程{0}:{1}", id, s);
        }

        //修改並輸出線程數量
        static void PrintCount(int add)
        {
            Interlocked.Add(ref count, add);
            Console.WriteLine("=> 信號量值:{0}", Interlocked.Exchange(ref count, count));
        }
    }
}

  

 

 Semaphore:可理解爲容許線程執行信號的池子,池子中放入多少個信號就容許多少線程同時執行。函數

private static void MultiThreadSynergicWithSemaphore()
  {
   //0表示建立Semaphore時,擁有可用信號量數值
   //1表示Semaphore中,最多容納信號量數值
   Semaphore semaphore = new Semaphore(0, 1);
 
 
   Thread thread1 = new Thread(() =>
   {
    //線程首先WaitOne等待一個可用的信號量
    semaphore.WaitOne();
    //在獲得信號量後,執行下面代碼內容
    Console.WriteLine("thread1 work");
    Thread.Sleep(5000);
    //線程執行完畢,將得到信號量釋放(還給semaphore)
    semaphore.Release();
   });
 
 
   Thread thread2 = new Thread(() =>
   {
    semaphore.WaitOne();
    Console.WriteLine("thread2 work");
    Thread.Sleep(5000);
    semaphore.Release();
   });
   thread2.Start();
   thread1.Start();
   //因在建立Semaphore時擁有的信號量爲0
   //semaphore.Release(1) 爲加入1個信號量到semaphore中
   semaphore.Release(1);
  }

  

明:spa

一、若是semaphore.Release(n),n>semaphore最大容納信號量,將出異常。
二、當semaphore擁有的信號量爲1時,Semaphore至關於Mutex
三、當semaphore擁有的信號量>1時,信號量的數量便可供多個線程同時獲取的個數,此時可認爲獲取到信號量的線程將同時執行(實際狀況可能與CPU核心數、CPU同時支出線程數有關)操作系統

相關文章
相關標籤/搜索