前言:

接续前节

[development][C] 条件变量(condition variables)的应用场景是什么

之前讨论了条件变量的问题, 已经知道在逻辑上, 条件变量(管程)(moniter) 与信号量 逻辑等价. 可以相互实现.

又知: 二元信号量可以用来实现互斥量.

那么是不是说进程间交互, 仅使用信号量便已经足够了能?

另一个问题: 在API层面上,  我们知道互斥量的使用原则是: 谁加锁谁释放. 但是二元信号量的用法却可以是线程A做V操作, 线程B做P操作.

这是否只是存在于API层面上的区别呢?

‎[:] ‎<‎tg2arch‎>‎ [lion] tong: 互斥量“就是”初始值为  的信号量,也就是二元信号量
‎[:] ‎<‎tg2arch‎>‎ [lion] 而没人规定信号量应该怎么用(谁获取谁释放),它只是个工具
‎[:] ‎<‎lilydjwg‎>‎ 还在讨论那些同步工具啊
‎[:] ‎<‎tg2arch‎>‎ [lion] 如果是初始值为1且获得之后释放。那就是互斥量保护临界区的写法
‎[:] ‎<‎tong‎>‎ lion: 嗯, 你这么一说, 我好像理解了.
‎[:] ‎<‎tg2arch‎>‎ [lion] 如果初始值是0,一个线程等待,一个线程运行后释放。那就是一个先后顺序的控制写法
‎[:] ‎<‎tg2arch‎>‎ [lion] 玩法很多…
‎[:] ‎<‎tong‎>‎ 嗯....
‎[:] ‎<‎tong‎>‎ 是不是, 其实只要有信号量就可以了
‎[:] ‎<‎lilydjwg‎>‎ 对了,Go 的 wait group 算是什么呢?
‎[:] ‎<‎tg2arch‎>‎ [lion] 如果两对信号量,值相加为 N,那就是一个缓存大小为 N 的生产者消费者模型(阻塞的 FIFO 队列)
‎[:] ‎<‎tg2arch‎>‎ [lion] waitgroup 即 AND型信号量
‎[:] ‎<‎tong‎>‎ 哇塞, lion好厉害.

不知道以上这些内容, 是否存在一个专门的知识分支?

一本书, 可以深入这个问题, 还没有来的及读:   <<The little book of Semaphores>>  http://greenteapress.com/wp/semaphores/

其他参考内容:

https://zh.wikipedia.org/wiki/%E4%BF%A1%E8%99%9F%E6%A8%99

https://en.wikipedia.org/wiki/Semaphore_(programming)

https://wizardforcel.gitbooks.io/think-os/content/ch11.html

API:

LInux C下有两套信号量的API

Posix:

http://man7.org/linux/man-pages/man7/sem_overview.7.html

  有名: sem_open() http://man7.org/linux/man-pages/man3/sem_open.3.html

  无名: sem_init() http://man7.org/linux/man-pages/man3/sem_init.3.html

System V:

http://man7.org/linux/man-pages/man2/semget.2.html

http://man7.org/linux/man-pages/man2/semop.2.html

http://man7.org/linux/man-pages/man2/semctl.2.html

关于二者的选用问题, Posix里边如是说:

       System V semaphores (semget(), semop(), etc.) are an older
semaphore API. POSIX semaphores provide a simpler, and better
designed interface than System V semaphores; on the other hand POSIX
semaphores are less widely available (especially on older systems)
than System V semaphores.

就是说, 请选用POSIX API !

[development][semaphore] 信号量/信号灯/信号标/旗语的更多相关文章

  1. 并发包Semaphore实现信号灯

    /** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ...

  2. 多线程锁:Mutex互斥体,Semaphore信号量,Monitor监视器,lock,原子操作InterLocked

    Mutex类 “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似,只有拥有互斥对象的线程才具有访问资源的权限, ...

  3. CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

    同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...

  4. Java并发编程笔记之Semaphore信号量源码分析

    JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那 ...

  5. 互联网进行限流策略的Semaphore信号量使用

    在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...

  6. python网络编程--线程Semaphore(信号量)

    一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...

  7. java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏

    简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ...

  8. Python 中Semaphore 信号量对象、Event事件、Condition

    Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...

  9. 21.Semaphore信号量

    Semaphore是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.Semaphore可以用来构建一些对象池,资 ...

随机推荐

  1. 【emWin】例程十七:窗口对象——Button

    介绍: 按钮小工具通常用作触摸屏的主要用户界面元素,本例程介绍按钮小工具的创建及使用方法. 触摸校准(上电可选择是否进入校准界面) 自绘按钮(通过回调函数来自行绘制各种形状的按钮) 设置按钮字体 设置 ...

  2. 【emWin】例程二十六:窗口对象——Listbox

    简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...

  3. supervisor开机自动启动脚本+redis+MySQL+tomcat+nginx进程自动重启配置

    [root@mongodb-host supervisord]# cat mongo.conf [program:mongo]command=/usr/local/mongodb/bin/mongod ...

  4. Java知多少(99)Graphics2D类的绘图方法

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的 ...

  5. ASP.NET MVC 4 (八) URL链接和Ajax帮助函数

    使用帮助函数创建链接 MVC提供一些帮助函数创建链接,这些函数根据路径映射表自动调整生成的URL: 说明 示例 输出结果 应用程序相对URL Url.Content("~/Content/S ...

  6. Orleans学习总结(四)--集群配置篇

    上篇我们讲了Orleans学习总结(三)--持久化篇,这一篇我们来说说集群配置,毕竟这个才是Orleans的看家本领 Orleans支持热起动,支持自动节点发现,能够断线重发等一系列黑科技. 我这篇是 ...

  7. NIO相关概念之Scatter / Gather

    Scatter /Gather 是java NIO中用来对channel的读取或者写入操作的特殊的形式的描述 Scatter(发散) 是指在读操作的时候,从chanel读取到的数据,写入到多个buff ...

  8. struts2,spring,ibatis学习

    1.1 什么是struts2? MVC思想给网站设计带来了巨大的好处,但是MVC毕竟只是一种思想,不同的程序员写出来的基于MVC思想的应用,风格可能不一样.影响程序的标准化,Struts是为了规范MV ...

  9. hadoop程序实例

    安装了Eclipse及hadoop-eclipse-plugin后学着<hadoop权威指南>中的气温例子写了一个输出气温的程序,数据是我自己简单写的,但是输出却不是我预想的,这中间还有很 ...

  10. perl 读取一个文件 替换文件的关键词 把数据替换到新的文件

    replace # replace #!/usr/bin/perl my @data = (); my ($fname ,$rp, $nfname)= @ARGV; my ($o, $n) = spl ...