日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Semaphore

發布時間:2025/3/8 C# 19 如意码农
生活随笔 收集整理的這篇文章主要介紹了 C# Semaphore 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.Semaphore定義
Semaphore,是負責協調各個線程, 以保證它們能夠正確、合理的使用公共資源。也是操作系統中用于控制進程同步互斥的量。

Semaphore常用的方法有兩個WaitOne()和Release(),Release()的作用是退出信號量并返回前一個計數,而WaitOne()則是阻止當前線程,直到當前線程的WaitHandle 收到信號。這里我舉一個例子讓大家更容易理解:

當我們這樣實例化Semaphore時候,如果寫Semaphore sema = new Semaphore(x,y)這種表達式,就可以理解為這樣一個場景

有一隊人排隊上洗手間,人就相當于線程,x為還剩余的位置數量,y為總的位置數量。

WaitOne()方法就相當于人在等待洗手間位置的行為,而Release()方法就相當于一個人從洗手間出來的行為,這里再假設x和y都為5,說明開始的時候洗手間有5個空位置,且總共只有5個位置,當一隊超過5個人的隊伍要上洗手間的就排隊,首先WaitOne()方法等待,發現有空位就依次進去,每進去一個空位減一,直到進去5之后個沒有空位,這時候后面的人就一直等待,直到進去的人從洗手間出來Release()方法,空位加一,在等待WaitOne()方法的人發現有空位又進去一個空位減一……如此循環往復。

2、代碼舉例

 1 class Program
2 {
3 static Semaphore semaphore;
4 //當前信號量中線程數量
5 static int count;
6 //用于生成隨機數
7 static Random r;
8
9 static void Main()
10 {
11 r = new Random();
12 //初始化信號量:初始請求數為1,最大請求數為3
13 semaphore = new Semaphore(1, 3);
14 //放出10個線程
15 for (int i = 0; i < 5; i++)
16 ThreadPool.QueueUserWorkItem(doo, i + 1);
17 Console.ReadKey(true);
18 }
19
20 static void doo(object arg)
21 {
22 int id = (int)arg;
23 PrintStatus(id, "等待信號量");
24 //獲取一個資源
25 semaphore.WaitOne();
26 PrintStatus(id, "獲得信號量開始執行");
27 PrintCount(1);
28 Thread.Sleep(r.Next(1000));
29 PrintStatus(id, "退出");
30 PrintCount(-1);
31 //釋放一個資源
32 semaphore.Release();
33
34 }
35
36 //輸出線程狀態
37 static void PrintStatus(int id, string s)
38 {
39 Console.WriteLine("線程{0}:{1}", id, s);
40 }
41
42 //修改并輸出線程數量
43 static void PrintCount(int add)
44 {
45 //在多進程(線程)的操作系統中不能被其它進程(線程)打斷的操作就叫原子操作,一個線程在執行其它線程無法搶占。
46 //對兩個 32 位整數進行求和并用和替換第一個整數,上述操作作為一個原子操作完成。
47 Interlocked.Add(ref count, add);
48 //以原子操作的形式,將 32 位有符號整數設置為指定的值并返回原始值。
49 Console.WriteLine("=> 信號量值:{0}", Interlocked.Exchange(ref count, count));
50 }
51 }

參考以下內容:https://www.cnblogs.com/legion/p/6934363.html

https://blog.csdn.net/yangwohenmai1/article/details/90236036

總結

以上是生活随笔為你收集整理的C# Semaphore的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。