semaphore: 保证指定个数的并发线程可以访问临界区。 而 lock/mutex:保证只有一个线程可以访问临界区(被lock住的)的资源或者代码。
namespace MutiThread { /// <summary> /// .net 信号量Semaphore的使用 /// </summary> class Program { static void Main(string[] args) { //初始化4个线程 Mythread mythrd1 = new Mythread("Thrd #1"); Mythread mythrd2 = new Mythread("Thrd #2"); Mythread mythrd3 = new Mythread("Thrd #3"); Mythread mythrd4 = new Mythread("Thrd #4"); //Join()方法阻塞调用线程 //达到主线程在4个子线程执行完毕才退出的目的 mythrd1.thrd.Join(); mythrd2.thrd.Join(); mythrd3.thrd.Join(); mythrd4.thrd.Join(); } } /// <summary> /// 封装线程类 /// </summary> 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(); } } }