资讯专栏INFORMATION COLUMN

信号量

OldPanda / 902人阅读

摘要:对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。创建信号量,设置容量,先有操作,才能操作。构造函数需要指定信号量的容量,可选指定是否公平,以防止低优先级线程的饥饿状态。

信号量是操作系统提供给用户使用的一种机制,帮助用户进程协调使用资源,用户编程的时候可以直接调用,不必自己设计。计算机对信号量只能执行 wait和signal这两种原子(sychronized)操作,即申请和释放信号量时无法被打断。

信号量多用于进程间的同步与互斥,简单的说一下同步和互斥的意思

同步:指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。

互斥:不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行

竞争:当并发进程竞争使用同一个资源的时候,我们就称为竞争进程

显然同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。

对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。
P操作从仓库拿货,如果仓库中没有货(if(signal==0)),线程一直等待(wait),直到V操作,往仓库里添加了货物,然后从仓库拿货(--signal)为了避免P操作一直等待下去,会有一个超时时间。

V操作,如果仓库满了(if(signal==bound)),线程等待(wait),直到有P操作,从仓库中拿走货物,有空的位置,往仓库送货(++signal)。

创建信号量,设置容量,先有V操作,才能P操作。
P操作:货物个数减1,减过之后,货物个数大于等于0,说明已经拿到货物,线程继续。否者线程阻塞。

V操作:货物个数加1,加过之后,货物个数小于等于容量,说明添加成功,线程继续。否者线程阻塞。

JDK1.5已经实现了Semaphore类,无须再自己实现。
构造函数需要指定信号量的容量,可选指定是否公平,以防止低优先级线程的饥饿状态。
Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68634.html

相关文章

  • Python线程专题5:号量与有边界的号量

    摘要:有边界的信号量语法创建一个新的有边界信号量。是计数器的初始值,如果忽略,将默认为信号量与有边界的信号量的区别的工作方式与完全相同,但操作的次数不能超过的操作次数。信号量与互斥锁的微妙差别信号量可用于发送信号。 上一篇文章:Python线程专题4:Timer对象、Lock对象、Rlock对象下一篇文章:Python线程专题6:事件 信号量与有边界的信号量 信号量是一个基于计数器的同步原...

    Dionysus_go 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<