1.实例构造器的理解
Semaphore sem = new Semaphore(x,y,name,boolNew);
信号量可以理解为厕所,y为厕所的总位置,x为厕所目前空余的位置,name为厕所的名字(信号量的名称),boolNew为createdNew,是否创建新的信号量。
2.两个方法 WaitOne()\Release()的理解
waitone()准备进厕所的人,执行一个waitone就进去一个,如果位置满了则等待。release()出厕所的人,如果出厕所的人大于厕所总位置会抛异常,不能两个人同时在同一个位置上做事。
3.两个信号量实现线程同步
using System;using System.Threading;namespace SemSynchronization {class Program {static Semaphore sem1 = new Semaphore(0,1);//第一个厕所,总共有一个坑位,且没有空余可使用的坑位。static Semaphore sem2 = new Semaphore(0,1);//第二个厕所,总共有一个坑位,且没有空余可使用的坑位。static void Main(string[] args) {Thread thread1 = new Thread(PrintOne);Thread thread2 = new Thread(PrintTwo);thread1.Start();//第一个线程开启thread2.Start();//第二个线程开启Thread.Sleep(50);sem1.Release(1); //第一个厕所有人出来了,执行操作,第二个厕所有人出来了,第一个厕所又有人排队了Console.ReadLine();}private static void PrintOne() {for (int i = 0; i < 5; i++) {sem1.WaitOne();//厕所满了,排队等待Console.WriteLine("PrintOne: "+i.ToString()) ;Thread.Sleep(1000);sem2.Release();}}private static void PrintTwo() {for (int i = 0; i < 5; i++) {sem2.WaitOne();//厕所满了,排队等待Console.WriteLine("PrintTwo: " + i.ToString());sem1.Release();}}}}
代码逻辑:两个厕所都有人,主线程的sem1.Release(1)厕所1出来一个人,线程1执行代码(sem2.Release厕所2出来一个人)
