由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂。由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误。信号量这个名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。

semaphore 英[ˈseməfɔ:(r)] vt. 发出信号,打旗语;
类似于指挥官的作用。
下面我们看下一个伪代码信号量的使用。
1、创建信号量唯一标识符
$ftok = ftok(__FILE__, 'a');
2、创建信号量资源ID
$sem_resouce_id = sem_get($ftok);
3、接受信号量
sem_acqure($sem_resource_id);
4、释放信号量
sem_release($sem_resource_id);
5、销毁信号量
sem_remove($sem_resource_id);
举个不文雅的例子,使我们容易理解这个信号量在生活中的用法。理解之后可以套用到我们编程领域。
一家公司只有一个卫生间。那么当有人上厕所的时候,都要获取一把锁(信号量),表示卫生间正在使用。代码如下:
sem_acqure($sem_resource_id);
那么员工上完厕所之后,就需要将锁打开,释放锁(信号量),表示现在可以允许别人使用。代码如下:
sem_release($sem_resource_id);
通过一个简单的锁,我们就能够知道当前的厕所(共享内存)是否可以使用。这个例子不雅观,但说明了问题。这篇博客也是有味道的博客,真是不容易。。。。以下是示例代码:
<?php
//创建共享内存区域
$shm_key = ftok(__FILE__, 'a');
$shm_id = shm_attach($shm_key, 1024, 0755);
//var_dump($shm_id);die(); resource(4) of type (sysvshm)
const SHARE_KEY = 1;
$child_list = [];
//加入信号量
$sem_id = ftok(__FILE__, 'b');
$signal = sem_get($sem_id);
//$signal resource(5) of type (sysvsem)
for ($i = 0; $i < 3; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
exit("Fork fail!".PHP_EOL);
} elseif ($pid == 0) {
//获取信号量
sem_acquire($signal);
if (shm_has_var($shm_id,SHARE_KEY)) {
$count = shm_get_var($shm_id, SHARE_KEY);
$count++;
//模拟业务处理
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
} else {
$count = 0;
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
}
echo "child process: ".getmypid()." is writing! now count is: $count ".PHP_EOL;
//释放信号量
sem_release($signal);
exit("child process".getmypid()."end".PHP_EOL);
} else {
$child_list[] = $pid;
}
}
while (count($child_list) > 0) {
foreach ($child_list as $key => $pid) {
$status = pcntl_waitpid($pid, $status);
if ($status > 0 || $status == -1) {
unset($child_list[$key]);
}
}
sleep(1);
}
$count = shm_get_var($shm_id, SHARE_KEY);
echo " $count ".PHP_EOL;
//销毁信号量
sem_remove($signal);
shm_remove($shm_id);
shm_detach($shm_id);
# 进程间通信
# 共享内存
# 进程通信
# 共享内存实现进程通信
# php进程通信之共享内存详细讲解
# php进程通信之信号量浅析介绍
# PHP多进程通信-消息队列使用
# PHP进程通信基础之信号
# PHP进程间通信的几种方法详解
# 信号量
# 都要
# 时间内
# 博客
# 不容易
# 英文
# 只有一个
# 使我
# 可以使用
# 这篇
# 类似于
# 上厕所
# 在生活中
# 举个
# 能多
# 看其
# 莫名其妙
# 但说
# php
# pre
相关文章:
建站之星后台密码如何安全设置与找回?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何快速搭建高效服务器建站系统?
魔方云NAT建站如何实现端口转发?
宝塔Windows建站如何避免显示默认IIS页面?
C#怎么创建控制台应用 C# Console App项目创建方法
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
javascript中的try catch异常捕获机制用法分析
英语简历制作免费网站推荐,如何将简历翻译成英文?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
网页设计网站制作软件,microsoft office哪个可以创建网页?
Python路径拼接规范_跨平台处理说明【指导】
焦点电影公司作品,电影焦点结局是什么?
如何快速生成凡客建站的专业级图册?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
专业网站建设制作报价,网页设计制作要考什么证?
如何在云主机上快速搭建网站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
高端云建站费用究竟需要多少预算?
常州自助建站费用包含哪些项目?
*服务器网站为何频现安全漏洞?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站org新手必看:2024最新搭建流程与模板选择技巧
常州企业网站制作公司,全国继续教育网怎么登录?
如何高效完成独享虚拟主机建站?
高防服务器租用指南:配置选择与快速部署攻略
如何在宝塔面板中修改默认建站目录?
如何在万网自助建站中设置域名及备案?
广平建站公司哪家专业可靠?如何选择?
做企业网站制作流程,企业网站制作基本流程有哪些?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
高防服务器:AI智能防御DDoS攻击与数据安全保障
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在橙子建站上传落地页?操作指南详解
浅析上传头像示例及其注意事项
在线制作视频网站免费,都有哪些好的动漫网站?
招贴海报怎么做,什么是海报招贴?
手机网站制作与建设方案,手机网站如何建设?
如何在阿里云购买域名并搭建网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
用v-html解决Vue.js渲染中html标签不被解析的问题
如何配置IIS站点权限与局域网访问?
家庭服务器如何搭建个人网站?
宝塔建站助手安装配置与建站模板使用全流程解析
如何选择高效响应式自助建站源码系统?
*请认真填写需求信息,我们会在24小时内与您取得联系。