C#线程控制工具Mutex(互斥锁)和Semaphore(信号量)以及Lock的用法和区别 - chunlieater/chunlifeet GitHub Wiki

Semaphore 有两个参数,初始count和最大count,每次调用waitone()函数来获得一个信号量,拿到后返回true,count就会减1,然后继续执行该线程,如果当前count为0,则无法拿到信号量返回false,该线程也会被阻断,直到count>0时,返回true并继续执行该线程,Semaphore可以被多个线程调用。

Mutex没有参数,可以看作是只能被一个线程使用的信号量为1的Semaphore,哪个线程请求互斥,就由哪个线程来解锁,一般用来把多线程的操作排列成线性进行。

Lock本质上和Mutex是一样的,能实现的功能也相同,注意用的时候一般来说会声明一个私有引用类型的变量来做Lock数据,这个数据被锁后,其余的线程读到Lock(object)时就会被阻止线程,不过如果没读到这个而是直接使用这个objec也是没有影响的,后台只不过是记录了一下这个变量的内存地址,并且放进锁定表里,让其余的线程来参考而已。