php Pthread 多线程 (四) 共享内存
2024-10-14 20:48:36
有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用shmop扩展。
<?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传进去了,为什么会出现无共享内存段?
我们知道shmop_open函数成功创建共享内存段后会返回一个ID,该类型是int型。当我们把该ID传入到子线程中时,子线程是无法通过该ID找到共享内存段。
最新文章
- 前端MVC框架Backbone 1.1.0源码分析(二) - 模型
- 【原创】探索Newlife X组件利器之:XCoder点滴[附下载]
- FastDFS简介
- BYTE 和字符串转换
- 努力学习 HTML5 (4)&mdash;&mdash; 浏览器对语义元素的支持情况
- R语言简单实现聚类分析计算与分析(基于系统聚类法)
- JavaScript数据结构——链表
- git subtree有效管理公共第三方lib
- 3D旋转特效
- 开启 htaccess 配置
- css应用四
- 获取执行计划——EXPLAN PLAN
- poj 3975&;amp;&;amp;hdu 1850 (nim)
- web与request
- FreeRTOS--堆内存管理
- 数据流中的第k大元素的golang实现
- ParallaxNode视差节点实现远景近景的不同层次移动
- HDFS 异构储存配置及基本命令操作
- 第三章 形容词(Les adjectifs)
- VSVC2010中常用的C++11特性