php Pthread 多线程 (四) 共享内存
<?php
class Count extends Thread {
private $name = '';
public function __construct($name) {
$this->name = $name;
}
public function run() {
//在Linux下可以使用sysvshm的扩展, shm_等函数
//共享内存段的key
$shmKey = 123;
//创建共享内存段
$shmId = shmop_open($shmKey, 'c', 0777, 64);
//读取共享内存数据
$data = trim(shmop_read($shmId, 0, 64));
$data = intval($data);
++$data;
shmop_write($shmId, $data, 0);
echo "thread {$this->name} data {$data} \r\n";
//删除关闭共享内存段
shmop_delete($shmId);
shmop_close($shmId);
}
}
$threads = array();
for($ix = 0; $ix < 10; ++$ix) {
$thread = new Count($ix);
$thread->start();
$threads[] = $thread;
}
foreach($threads as $thread) {
$thread->join();
}
如上代码可以正常运行。结果如下:

但是如果我把代码改成如下情况:
<?php
class Count extends Thread {
private $name = '';
private $shmId = ''; public function __construct($name, $shmId) {
$this->name = $name;
$this->shmId = $shmId;
} public function run() {
$data = shmop_read($this->shmId, 0, 64);
$data = intval($data);
++$data;
shmop_write($this->shmId, $data, 0);
echo "thread {$this->name} data {$data} \r\n";
}
} //在Linux下可以使用sysvshm的扩展
//共享内存段的key
$shmKey = 123;
//创建共享内存段
$shmId = shmop_open($shmKey, 'c', 0777, 64);
//写入数据到共享内存段
shmop_write($shmId, '1', 0); $threads = array();
for($ix = 0; $ix < 10; ++$ix) {
$thread = new Count($ix, $shmId);
$thread->start();
$threads[] = $thread;
} foreach($threads as $thread) {
$thread->join();
} echo shmop_read($shmId, 0, 64); //删除关闭共享内存段
shmop_delete($shmId);
shmop_close($shmId);
上述代码就会出现如下警告:
Warning: shmop_read(): no shared memory segment with an id of [4] in D:\wwwroot\
thread\demo6.php on line 13
PHP Warning: shmop_write(): no shared memory segment with an id of [4] in D:\ww
wroot\thread\demo6.php on line 16
字面意思是无共享内存段,在new线程的过程中我们已经通过构造函数把$shmId传进去了,为什么会出现无共享内存段?
php Pthread 多线程 (四) 共享内存的更多相关文章
- Linux进程间通信(四) - 共享内存
共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...
- 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...
- linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...
- Akka系列(四):Akka中的共享内存模型
前言...... 通过前几篇的学习,相信大家对Akka应该有所了解了,都说解决并发哪家强,JVM上面找Akka,那么Akka到底在解决并发问题上帮我们做了什么呢? 共享内存 众所周知,在处理并发问题上 ...
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...
- 细说linux IPC(四):posix 共享内存
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 上一节讲了由open函数打开一 ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
随机推荐
- Hadoop2.0构成之HDFS2.0
HDFS2.0之HA 主备NameNode: 1.主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换: 2.主NameNode的信息发生变化后,会将信息写到共享数 ...
- MySQL 安装方法
所有平台的Mysql下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. Linux/UNIX上安装Mysql Linux平台上推荐使用RP ...
- guess_age
age_shanshan = 18count = 3num = 0while num < count: age = int(input("age:")) if age == ...
- X-Requested-With
最近工作中发现,使用angular $http跨域的时候,虽然后台已经配置了跨域允许,但是还是报错. 查资料发现,angular $http 的request的请求头中,默认有: Access-Con ...
- js数组的初始化
方法一: var myarray = new Array(66,80,90,77,59); 方法二: var myarray = [66,80,90,77,59]; 方法三: var myarray= ...
- php读取word里面的内容antiword
其实是现在一个linux下的扩展 1 先安装 antiword yum antiword install 2 写测试php代码 header("Content-type: text/htm ...
- servletConfig的使用案例
servletConfig参数的使用案例 首先,建立Dynamic Web Project ,同样命名FirstServlet,然后建立Servlet:Login.java,包名为cc.openhom ...
- HtmlRowCreated关于e.Row.Cells[0]的获取和设置
获取采用: cmd2.Parameters.AddWithValue("@xh", e.GetValue("学号").ToString().Trim()); ...
- 2.mybatis实战教程(mybatis in action)之二:以接口的方式编程
转自:http://www.yihaomen.com/article/java/304.htm 前面一章,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询. 请注 ...
- ABAP-BarCode-2-Excel打印二维码
以前用Excel打印过二维码看板标签,将实现过程备注下. 1.安装控件 安装文件:TBarCodeOffice.exe 2.控件注册 打开Excel,找到[选项] 在打开的界面选择[加载项],在活动应 ...