php Pthread 多线程 (四) 共享内存
2017-01-17 20:07
423 查看
有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用shmop扩展。
如上代码可以正常运行。结果如下:
但是如果我把代码改成如下情况:
上述代码就会出现如下警告:
字面意思是无共享内存段,在new线程的过程中我们已经通过构造函数把$shmId传进去了,为什么会出现无共享内存段?
我们知道shmop_open函数成功创建共享内存段后会返回一个ID,该类型是int型。当我们把该ID传入到子线程中时,子线程是无法通过该ID找到共享内存段。
<?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找到共享内存段。
相关文章推荐
- 用Pthread对共享内存系统进行多线程并行编程
- php之中使用共享内存进行高速数据更新的一种方案
- 多线程进程间通讯共享内存(Shared Memory with IPC with threads)
- PHP相关系列 - 使用 PHP 直接在共享内存中存储数据集
- php共享内存实现
- PHP IPC函数介绍---共享内存
- [转]PHP之中使用共享内存进行高速数据更新的一种方案
- 使用 PHP 直接在共享内存中存储数据集
- 多线程访问共享内存的不加锁实现方式
- [PHP]使用 PHP 直接在共享内存中存储数据集
- php中对共享内存,消息队列的操作
- PHP 信号与共享内存(两个类)-1
- PHP利用共享内存构建计数器完成自增数值id生成--适用于网页游戏携带区服号的数值id生成
- php共享内存使用
- 使用 PHP 直接在共享内存中存储数据集
- php共享内存使用
- PHP实现共享高速内存数据池(非MYSQL数据库) - 类似asp的application
- 为fastcgi下的php配置共享内存的eAccelerator加速
- Posix多线程-共享内存
- 多线程访问共享内存的不加锁实现方式