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出来一个人)