线程中的Semaphore理解

一个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一样跨越进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值