对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。

P操作从仓库拿货,如果仓库中没有货,线程一直等待,直到V操作,往仓库里添加了货物,为了避免P操作一直等待下去,会有一个超时时间。

V操作往仓库送货,如果仓库满了,线程等待,直到有P操作,从仓库中拿走货物,有空的位置。

创建信号量,设置容量,先有V操作,才能P操作。

P操作:货物个数减1,减过之后,货物个数大于等于0,说明已经拿到货物,线程继续。否者线程阻塞。

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

信号量:0≤ 信号量≤容量 ,取值 表示当前可以使用的货物;

        信号量<0 ,  取值 表示当前等待使用货物的线程;

信号量>容量 ,  信号量-容量 表示当前等待添加货物的线程。

通常,信号量的容量设置很大,可以一直V操作,不会阻塞,但是P操作的时候,很可能阻塞。

当容量为1,也就是互斥,执行流程必定是V操作,P操作,V操作,P操作...


信号量如何做到线程同步?

可以认为信号量关联一组线程,保存一个指针,指向线程数组的首地址。比如当前信号量为-1,进行P操作,信号量为-2,说明没有拿到货物,线程等待,取值为-2,说明有两个线程等待那货物。这个时候,其他线程进行V操作,信号量加1,为-1,信号量通知等待的线程中,第一个线程继续执行,第二个线程继续等待。

也就是说,P操作等待的情况是减1后,信号量小于0。 P操作继续执行的情况有两种:a、减1后,信号量大于等于0,不需等待,直接执行;b、信号量小于0,等待中,其他人进行了V操作,通知这个线程,继续执行。


项目中的使用场景:

客户端使用提供的SDk与服务交互,为了提高效率,客户端发送一个请求后,SDK异步回调给客户端。但是,有些请求,客户端希望同步,等待回复。这个时候,建立一个map,以req的sequence为key,value为信号量的指针,信号量的容量设置为1,可用的货物为0,对信号量进行TimeoutP操作,货物个数为-1,阻塞在这里。异步回调,收到回复的sequence,根据map找到信号量指针,进行V操作,货物个数为0,通知前面TimeoutP的线程继续执行下去,这个时候,TimeoutP的线程,把回复消息取出来,返回给客户端。

最新文章

  1. 通过GitHub Pages建立个人站点总结与体会
  2. android自定义viewgroup实现等分格子布局
  3. 关于js字符串替换的一道笔试题目
  4. windows 说“我爱你”
  5. 【转载】wireshark:no interface can be used for capturing in this system with the current configuration
  6. libCEF总结01下载、编译、入门
  7. sql server 数据页缓冲区的内存瓶颈分析
  8. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(转)
  9. 关于promise
  10. 前端bug记录---不定时更新
  11. cad2007 钢筋符号显示为问号
  12. 如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)
  13. 谈javascript变量声明
  14. C语言--总结报告
  15. μC/OS-II 的系统时钟
  16. 关于Linux系统下jdk版本切换问题(alternatives命令的使用)
  17. springmvc与ajax交互常见问题
  18. odoo tree视图 当页不弹窗显示方法
  19. url空格转码的问题
  20. 使用Numpy验证Google GRE的随机选择算法

热门文章

  1. 安装win7和ubuntu16.04双系统
  2. Java描述设计模式(22):策略模式
  3. 报错:尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  4. 20191031-9 beta week 1/2 Scrum立会报告+燃尽图 07
  5. alpha week 2/2 Scrum立会报告+燃尽图 01
  6. 作业要求20191010-8 alpha week 1/2 Scrum立会报告+燃尽图 06
  7. AntDeploy一键发布netcore3.0Windows服务到远程服务器
  8. 跑健壮性Monkey,出现一次Crash全过程-日志分析-Dotest董浩
  9. linux bash编程之函数和循环控制
  10. overflow属性值