有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用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找到共享内存段。

 

最新文章

  1. 前端MVC框架Backbone 1.1.0源码分析(二) - 模型
  2. 【原创】探索Newlife X组件利器之:XCoder点滴[附下载]
  3. FastDFS简介
  4. BYTE 和字符串转换
  5. 努力学习 HTML5 (4)&mdash;&mdash; 浏览器对语义元素的支持情况
  6. R语言简单实现聚类分析计算与分析(基于系统聚类法)
  7. JavaScript数据结构——链表
  8. git subtree有效管理公共第三方lib
  9. 3D旋转特效
  10. 开启 htaccess 配置
  11. css应用四
  12. 获取执行计划——EXPLAN PLAN
  13. poj 3975&amp;amp;&amp;amp;hdu 1850 (nim)
  14. web与request
  15. FreeRTOS--堆内存管理
  16. 数据流中的第k大元素的golang实现
  17. ParallaxNode视差节点实现远景近景的不同层次移动
  18. HDFS 异构储存配置及基本命令操作
  19. 第三章 形容词(Les adjectifs)
  20. VSVC2010中常用的C++11特性

热门文章

  1. Jade简单教程
  2. javascript创建对象之寄生构造函数模式(六)
  3. 第3章 文件I/O(4)_dup、dup2、fcntl和ioctl函数
  4. 从线性回归到CNN【转】
  5. CSS3 圆角属性 border-radius和-webkit-border-radius使用
  6. css position小结
  7. 浅谈forword和sendRedirect
  8. !!! jquery mobile常用代码
  9. ZABBIX监控80连接数
  10. spring securiry Xml 配置 登陆