1.实例构造器的理解

Semaphore sem = new Semaphore(x,y,name,boolNew);
信号量可以理解为厕所,y为厕所的总位置,x为厕所目前空余的位置,name为厕所的名字(信号量的名称),boolNew为createdNew,是否创建新的信号量。

2.两个方法 WaitOne()\Release()的理解

waitone()准备进厕所的人,执行一个waitone就进去一个,如果位置满了则等待。release()出厕所的人,如果出厕所的人大于厕所总位置会抛异常,不能两个人同时在同一个位置上做事。

3.两个信号量实现线程同步

  1. using System;
  2. using System.Threading;
  3. namespace SemSynchronization {
  4. class Program {
  5. static Semaphore sem1 = new Semaphore(0,1);//第一个厕所,总共有一个坑位,且没有空余可使用的坑位。
  6. static Semaphore sem2 = new Semaphore(0,1);//第二个厕所,总共有一个坑位,且没有空余可使用的坑位。
  7. static void Main(string[] args) {
  8. Thread thread1 = new Thread(PrintOne);
  9. Thread thread2 = new Thread(PrintTwo);
  10. thread1.Start();//第一个线程开启
  11. thread2.Start();//第二个线程开启
  12. Thread.Sleep(50);
  13. sem1.Release(1); //第一个厕所有人出来了,执行操作,第二个厕所有人出来了,第一个厕所又有人排队了
  14. Console.ReadLine();
  15. }
  16. private static void PrintOne() {
  17. for (int i = 0; i < 5; i++) {
  18. sem1.WaitOne();//厕所满了,排队等待
  19. Console.WriteLine("PrintOne: "+i.ToString()) ;
  20. Thread.Sleep(1000);
  21. sem2.Release();
  22. }
  23. }
  24. private static void PrintTwo() {
  25. for (int i = 0; i < 5; i++) {
  26. sem2.WaitOne();//厕所满了,排队等待
  27. Console.WriteLine("PrintTwo: " + i.ToString());
  28. sem1.Release();
  29. }
  30. }
  31. }
  32. }

代码逻辑:两个厕所都有人,主线程的sem1.Release(1)厕所1出来一个人,线程1执行代码(sem2.Release厕所2出来一个人)
image.png