[development][semaphore] 信号量/信号灯/信号标/旗语
前言:
接续前节
[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] 信号量/信号灯/信号标/旗语的更多相关文章
- 并发包Semaphore实现信号灯
/** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ...
- 多线程锁:Mutex互斥体,Semaphore信号量,Monitor监视器,lock,原子操作InterLocked
Mutex类 “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似,只有拥有互斥对象的线程才具有访问资源的权限, ...
- CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏
同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...
- Java并发编程笔记之Semaphore信号量源码分析
JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那 ...
- 互联网进行限流策略的Semaphore信号量使用
在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...
- python网络编程--线程Semaphore(信号量)
一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...
- java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏
简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ...
- Python 中Semaphore 信号量对象、Event事件、Condition
Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...
- 21.Semaphore信号量
Semaphore是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.Semaphore可以用来构建一些对象池,资 ...
随机推荐
- Egret里用矢量挖圆形的洞
项目里需要用到,但是不是用在新手引导上,下面的代码可以绘制一个圆的四分之一,用四个即可拼出一个圆. private createShape(): egret.Shape { let magicNum ...
- 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
从网上抓了一些字节流,想打印出来结果发生了一下错误: UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position ...
- openfire开发文档
http://www.blogjava.net/yi88han/archive/2009/02/11/254203.html
- linux grep 取出特定字符串并统计个数
原始日志如下: $more text.log 2018-07-16 00:00:03 [DEBUG] request setInformation params:{"msg":&q ...
- PHP更改自动加载的顺序
composer的锅 自从PHPer们用上了composer后,对于传统的加载方式倒是不会用了,可谓是"收之东隅,失之桑榆". 下面说一下怎么改变加载顺序来覆写Laravel中的h ...
- IP分片与重组详解
大家对IP数据包头,应该不陌生吧 分片便是与图中圈出来的两个地址有关,本文也是将主要围绕他们展开. 那我们先来了解他们的概念. 标志一个三比特字段遵循与用于控制或识别片段.他们是(按顺序,从高分以低位 ...
- Spring源码学习:day2
前言: 我还是太懒了,连截图都懒得粘贴,故直接用书上说的话的截图吧. 代码的编写过程都是应该有一个入口的,所有的代码最终都是为了那个入口更加方便更加简单而产生的. 看代码的过程,就应该抓住主线,顺着主 ...
- php中urlencode和urldecode的用法
URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...
- phpstrom2018
http://www.oyksoft.com/soft/40722.html?pc=1
- 原生App切图的那些事儿
如何切图? 了解iphone界面的尺寸 最小的分辨率是320x480,我们把这个尺寸定为基准界面尺寸(baseline),基准尺寸所用的图标定为1倍图(1x). 在实际设计过程中,为了降低设计成本,一 ...