一个Semaphore(信号量)就像一个夜总会一样:它有一个特定的capacity(容量),被一个保镖强制限制。一旦它满了,没有人能再进去,然后就在外面形成了一个等待的Queue(队列)。接着,一个人离开,Queue的首部的那个人进入。这种constructor(构造器)需要至少两个参数:夜总会中目前可用的位置和夜总会的capacity。
一个带着capacity的semaphore类似于一个Mutex(互斥量)或者lock(锁),只是semaphore没有“拥有者”,换言之,它是thread(线程)不可知的。任何一个thread可以基于semaphore调用释放,而基于Mutex和lock,只有包含了lock的thread才可以释放它。
有两个功能相似的类:Semaphore和SemaphoreSlim。后者在Framework4.0中有介绍并且被优化,达到并行程序中的low-latency(低延时)要求。它在传统的多线程中也很有用,因为它可以让你在等待的时候指定一个取消记号。然而,它不能用于进程间的信号发送。 Semaphore在调用WaitOne或者Release时需要1微妙;SemaphoreSlim只需要四分之一微秒。 |
Semaphore在限制并发性中很有用——防止太多的thread一起执行一个特定的代码段。在下面的例子当中,5个thread试图进入夜总会但是植被允许一次进入三个:
如果那个Sleep语句被代替执行集中的硬盘I/O(读写),Semaphore将通过限制过多并行的硬盘驱动处理活动改善执行效率。
一个Semaphore,一旦命名,则可以和一个Mutex一样跨越进程。
若有相关技术讨论,请加QQ:695102294,期待与你的交流。