php 信号量 关闭,php 信号量

一些理论基础:

信号量:又称为信号灯、旗语 用来解决进程(线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁。

临界资源:每次仅允许一个进程访问的资源。

临界区:每个进程中访问临界资源的那段代码叫临界区

进程互斥:两个或以上的进程不能同时进入关于同一组共享变量的临界区域,即一个进程正在访问临界资源,另一个进程要想访问必须等待。

进程同步主要研究如何确定数个进程之间的执行顺序和避免数据竞争的问题 即,如何让多个进程能一块很好的协作运行

举例子:(来源百科)

以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。

在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

$key=ftok(__FILE__,'t');

/**

* 获取一个信号量资源

int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]]

$max_acquire:最多可以多少个进程同时获取信号

$perm:权限 默认 0666

$auto_release:是否自动释放信号量

*/

$sem_id=sem_get($key);

#获取信号

sem_acquire($seg_id);

//do something 这里是一个原子性操作

//释放信号量

sem_release($seg_id);

//把次信号从系统中移除

sem_remove($sem_id);

//可能出现的问题

$fp = sem_get(fileinode(__DIR__), 100);

sem_acquire($fp);

$fp2 = sem_get(fileinode(__DIR__), 1));

sem_acquire($fp2);

Implementation of a read-write semaphore in PHP:

class rw_semaphore {

const READ_ACCESS = 0;

const WRITE_ACCESS = 1;

/**

* @access private

* @var resource - mutex semaphore

*/

private $mutex;

/**

* @access private

* @var resource - read/write semaphore

*/

private $resource;

/**

* @access private

* @var int

*/

private $writers = 0;

/**

* @access private

* @var int

*/

private $readers = 0;

/**

* Default constructor

*

* Initialize the read/write semaphore

*/

public function __construct() {

$mutex_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'm');

$resource_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'r');

$this->mutex = sem_get($mutex_key, 1);

$this->resource = sem_get($resource_key, 1);

}

/**

* Destructor

*

* Remove the read/write semaphore

*/

public function __destruct() {

sem_remove($this->mutex);

sem_remove($this->resource);

}

/**

* Request acess to the resource

*

* @param int $mode

* @return void

*/

private function request_access($access_type = self::READ_ACCESS) {

if ($access_type == self::WRITE_ACCESS) {

sem_acquire($this->mutex);

/* update the writers counter */

$this->writers++;

sem_release($this->mutex);

sem_acquire($this->resource);

} else {

sem_acquire($this->mutex);

if ($this->writers > 0 || $this->readers == 0) {

sem_release($this->mutex);

sem_acquire($this->resource);

sem_acquire($this->mutex);

}

/* update the readers counter */

$this->readers++;

sem_release($this->mutex);

}

}

private function request_release($access_type = self::READ_ACCESS) {

if ($access_type == self::WRITE_ACCESS) {

sem_acquire($this->mutex);

/* update the writers counter */

$this->writers--;

sem_release($this->mutex);

sem_release($this->resource);

} else {

sem_acquire($this->mutex);

/* update the readers counter */

$this->readers--;

if ($this->readers == 0)

sem_release($this->resource);

sem_release($this->mutex);

}

}

/**

* Request read access to the resource

*

* @return void

*/

public function read_access() { $this->request_access(self::READ_ACCESS); }

/**

* Release read access to the resource

*

* @return void

*/

public function read_release() { $this->request_release(self::READ_ACCESS); }

/**

* Request write access to the resource

*

* @return void

*/

public function write_access() { $this->request_access(self::WRITE_ACCESS); }

/**

* Release write access to the resource

*

* @return void

*/

public function write_release() { $this->request_release(self::WRITE_ACCESS); }

}

共享内存+信号 实现原子性操作

$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R');

$shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);

$data = shm_attach($shmid, 1024);

// we now have our shm segment

// lets place a variable in there

shm_put_var ($data, $inmem, "test");

// now lets get it back. we could be in a forked process and still have

// access to this variable.

printf("shared contents: %s\n", shm_get_var($data, $inmem));

shm_detach($data);

以上列子来源php手册  sem_get 函数comment

ucos实时操作系统学习笔记——任务间通信(信号量)

ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...

Linux 信号量详解一

信号量主要用于进程间(不是线程)的互斥,通过sem_p()函数加锁使用资源,sem_v函数解锁释放资源,在加锁期间,CPU从硬件级别关闭中断,防止pv操作被打断. semget函数 int semge ...

PHP进程通信基础——信号量+共享内存通信

PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...

C#多线程--信号量(Semaphore)

百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Releas ...

Linux学习笔记(15)-信号量

在多线程或者多进程编程中,有一个非常需要关注的东西,那就是同步以及互斥问题. 同步是指多个进程之间的协作,而互斥是指多个进程之间,为了争夺有限的资源,而进行的竞争. 理论很高端,但经过自己几天的学习, ...

多线程之信号量(By C++)

信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量. 所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行.你会怎么做,所有就需要给出一个流程1结束 ...

信号量sem

一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更 ...

【.NET深呼吸】线程信号量(Semaphore)

Semaphore类可以控制某个资源允许访问的线程数,Semaphore有命名式的,也有不命名的:如果不考虑跨进程工作,一般在代码中使用不命名方式即可. 信号量有点类似于等待句柄,某个线程如果调用了W ...

java多线程--信号量Semaphore的使用

Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量. 例如网吧里有100台机器,那么最多只能提 ...

java多线程-信号量

Semaphore(信号量)是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域.自从 5.0 开始,jdk 在 java.util.concurrent 包 ...

随机推荐

使用Apache的Base64类实现Base64加解密

包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Base64 1.Base64加密 public sta ...

关于H5中自定义属性的设置和获取

自定义数据属性是在HTML5中新加入的一个特性.简单来说,自定义数据属性规范规定任何以data-开头属性名并且赋值.自定义数据属性是为了保存页面或者应用程序的私有自定义数据,这些自定义数据属性保存进D ...

JavaScript基础---语言基础(3)

流程控制语句 学习要点: 1.switch语句 2.for...in语句 3.break和continue语句 4.with语句 ECMA-262规定了一组流程控制语句.语句定义了ECMAScript ...

C++程序设计教程学习(0)-引子

回想一下从事C++相关开发工作已经有4年,主要从事基于MFC.Duilib等GUI框架开发进行windows应用程序开发,还涉及了一些开源的项目.但是真的谈起这门语言或多或少都会有些心虚,关于C++的 ...

Word文件交换的电脑打开字体、排版变化的原因和解决方法!

方案: 有时候.我们好不easy用Word写好文档,做好排版发给别人,别人会告诉你格式怎么是乱的啊,标题.正文.页眉页脚什么的格式都变了. 想尽各种办法都没能得到解决,那么出现这样的情况的原因究竟是什 ...

poj 3375 Network Connection

今天在叉姐的群里找点题目做,这题目还是很好的:提意思如下 [有M个可以提供计算机网络的端口和N台计算机(计算机数量少于端口数),每个端口和计算机有一个坐标(一维的)!其中端口与计算机链接的距离 |x  ...

ERROR: No pool defined. at least one pool section must be specified in config file

root@ubuntu:/opt/php7# /opt/php7/sbin/php-fpm [22-Sep-2015 14:29:00] WARNING: Nothing matches the in ...

mysql中的union用法以及子查询综合应用

union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集. 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1.能否从2张表查询再uni ...

Python爬虫入门教程 5-100 27270图片爬取

27270图片----获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位, ...

Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接: MQ参考文档 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic=%2Fcom.ib ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享:MetaModel 3.2.5 发布,数据库元模型

MetaModel 3.2.5 发布,数据库元模型 http://www.oschina.net/news/36236/metamodel-3-2-5

CALL FOR DUTY 来和我们一起冒险吧!

我们面临的挑战是什么?昨天发了一篇让大家提问Scott Hanselman的问题,有人调侃 (也许是认真的)让我问他:“.NET还有救吗?” ,我的第一反应不是.NET还有没有救,而是该怎么救问这个问题…

HarmoryOS,API9项目配置

官方配置信息讲解如下:文档中心 1、APP名字图标:在entry模块,module.json5文件中 2、module配置 build-profile.json5文件中 3、包名 app.json5

厉害!他33岁破格晋升教授和博导,成果还打破国外技术垄断

全世界只有3.14 % 的人关注了爆炸吧知识来源 | 长江大学新闻网、长江大学石油工程学院、PaperRSS转自 | 学术资源大全他是人到中年"顺意人生"的代表,29岁晋升副教授、33岁破格晋升教授和博导;他独辟蹊径,将"智能"融入石油…

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)1.概述类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法,但通常你会处理一组对…

开源网站

开源网站: Code Google 谷歌旗下的一个开源项目托管网站,资源很丰富,文档也很齐全,甚至还有中文文档。 Souceforge 国外一个比较有名的开源网站,很多有名的开源项目都是在这个网站托管的。 Github 也很不错的一个开源网…

Android之Volley 源码解析

原文来自:http://www.codekk.com 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。 名字由来:a burst or emission of many things or a large amount at once 发布演讲…

双击打开Inventor文件

为什么80%的码农都做不了架构师?>>> 出现的问题: 正常启动电脑后,我双击桌面上的一个idw文件,默认使用 Inventor 2013 打开该格式的文件;但 Inventor 启动不到一半就弹出了如下的错误窗口,点击…

php long2ip,php 中IPV6 ip2long的问题解决办法

在32位系统,ip2long不能转换IPv6,但您可以转换ip2bin和bin2ip 这个函数转换为IPv4和IPv6,返回false,如果是无效的实例程序 代码如下复制代码function ip2bin($ip){if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ! fa…

phpstrom 编辑器设置

http://www.jb51.net/article/58069.htm 配置sublime主题 保存配置的路径为:将Monokai_Sublime.xml拷贝到C:\Users\Administrator\.WebIde100\config\colors,然后重启phpstrom即可 当主题样式选为暗黑色的时候,选中的代码的背景色也会有点暗…

记一次 .NET 某妇产医院 WPF内存溢出分析

一:背景 1. 讲故事上个月有位朋友通过博客园的短消息找到我,说他的程序存在内存溢出情况,寻求如何解决。要解决还得通过 windbg 分析啦。二:Windbg 分析 1. 为什么会内存溢出大家都知道内存溢出对应着 .NET 中的 OutOfMemonryExce…

16世纪的旷世奇才:大学弃医丛数,仅用20年就独立发明了温度计、军事罗盘、天文望远镜,后半生双目失明还能写出惊人科学著作

全世界只有3.14 % 的人关注了爆炸吧知识传说,在崇尚绝对权威的中世纪里,有这么一位敢于质疑权威的年轻人。在比萨斜塔上做了“两个铁球同时落地”的实验,得出了重量不同的两个铁球同时下落的结论。从此推翻了亚里士多德“物体下落速度和重量成…

禅道项目管理软件介绍

使用流程 一、分享的流程图 二、流程图 维护产品及模块 一、如何来添加产品呢?让我们来看下步骤: 以管理员或者其他有产品管理权限的帐号登录。点击产品视图。在页面右侧,点击“新增产品”,即可出来产品添加页面。(第一…

轻松学PHP编程 源代码

http://pan.baidu.com/share/link?shareid170353&uk1191536722 转载于:https://blog.51cto.com/letianwuji/1106854

java jar包 平滑重启,nginx 平滑重启的实现方法

一、背景在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0。最近调研了一下nginx平滑重启,觉得很有意思,记录下来供有兴趣的同学查阅…

Android之图形图像之使用Path类总结

Path类可以预先在View上将N个点连成一条"路径",然后调用Canvas的drawPath(path,paint)即可沿着路径绘制图形 Android还为路径绘制提供了PathEffect来定义绘制效果,PathEffect包含如下子类 ComposePathEffect CornerPathEffect DashPathEffect DiscretePathEffect Pat…

[ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她…

js调用高德API获取所在当前城市

可以在js代码中直接调用API接口&#xff0c;获取所处当前城市信息&#xff0c;代码如下&#xff1a; <script type"text/javascript">function getCurrentCity(){$.ajax({type: "get",url: "http://webapi.amap.com/maps/ipLocation?key608d75…

神奇的交际圈!这位17世纪的法国神父结交的好朋友,竟然都是一流数学牛人:笛卡尔、费马、加森迪······

全世界只有3.14 % 的人关注了爆炸吧知识话说&#xff0c;在近代数学史上&#xff0c;人们惊讶地发现17至18世纪的法国竟然产生了众多一流的数学家。然而&#xff0c;最早想到要培养一波优秀人才的&#xff0c;成就这段群星璀璨的传奇历史&#xff0c;并非是君王。而是出自于一位…

如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?

咨询区 Dmitriy我在 ASP.NET Core 中使用 GRPC.ASPNETCore 工具包写 gRPC 服务&#xff0c;现在我想实现 gRPC 的异常全局拦截&#xff0c;我的代码如下&#xff1a;app.UseExceptionHandler(configure > {configure.Run(async e >{Console.WriteLine("Exception te…