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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常用知识总结——信号量

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用知识总结——信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html


信號量 Semaphore

類似互斥鎖,但它可以允許多個線程同時訪問一個共享資源

通過使用一個計數器來控制對共享資源的訪問,如果計數器大于0,就允許訪問,如果等于0,就拒絕訪問。計數器累計的是“許可證”的數目,為了訪問某個資源。線程必須從信號量獲取一個許可證。

通常在使用信號量時,希望訪問共享資源的線程將嘗試獲取一個許可證,如果信號量的計數器大于0,線程將獲取一個許可證并將信號量的計數器減1,否則先線程將阻塞,直到獲取一個許可證;當線程不再需要共享資源時,將釋放鎖擁有的許可證,并將許可證的數量加1,如果有其他的線程正在等待許可證,那么該線程將立刻獲取許可證。

另外,允許同時訪問的資源的進程數量是在創建信號量時指定的,如果創建一個允許進程訪問的信號量數目為1,則該信號量就和互斥鎖的用法一樣。

Public Semaphore(int initialCount,int maximumCount)

initialCount指信號量許可證的初始值,maximumCount為最大值

獲取許可證使用WaitOne()

不需要時釋放使用 public int Release();或者public int Release(int? releaseCount);

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 using?System; using?System.Collections.Generic; using?System.Linq; using?System.Text; using?System.Threading; namespace?MyTTCon { ????class?mythread ????{ ????????public?Thread thrd; ????????//創建一個可授權2個許可證的信號量,且初始值為2 ????????static?Semaphore sem = new?Semaphore(2, 2); ????????public?mythread(string?name) ????????{ ????????????thrd = new?Thread(this.run); ????????????thrd.Name = name; ????????????thrd.Start(); ????????} ????????void?run() ????????{ ????????????Console.WriteLine(thrd.Name + "正在等待一個許可證……"); ????????????//申請一個許可證 ????????????sem.WaitOne(); ????????????Console.WriteLine(thrd.Name + "申請到許可證……"); ????????????for?(int?i = 0; i < 4 ; i++) ????????????{ ????????????????Console.WriteLine(thrd.Name + ": "?+ i); ????????????????Thread.Sleep(1000); ????????????} ????????????Console.WriteLine(thrd.Name + " 釋放許可證……"); ????????????//釋放 ????????????sem.Release(); ????????} ????} ????class?mysemaphore ????{ ????????public?static?void?Main() ????????{ ????????????mythread mythrd1 = new?mythread("Thrd #1"); ????????????mythread mythrd2 = new?mythread("Thrd #2"); ????????????mythread mythrd3 = new?mythread("Thrd #3"); ????????????mythread mythrd4 = new?mythread("Thrd #4"); ????????????mythrd1.thrd.Join(); ????????????mythrd2.thrd.Join(); ????????????mythrd3.thrd.Join(); ????????????mythrd4.thrd.Join(); ????????} ????} }

?


總結

以上是生活随笔為你收集整理的常用知识总结——信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

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