加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php Pthread 多线程 (四) 共享内存

发布时间:2020-05-25 08:14:19 所属栏目:PHP 来源:互联网
导读:有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用shmop扩展。 lt;?php class Count extends Thread { private $name = #39;#

有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用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,64));
        $data = intval($data);
        ++$data;
        shmop_write($shmId,$data,0);
        echo "thread {$this->name} data {$data} rn";

        //删除关闭共享内存段
        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,64);
        $data = intval($data);
        ++$data;
        shmop_write($this->shmId,0);
        echo "thread {$this->name} data {$data} rn";
    }
}

//在Linux下可以使用sysvshm的扩展
//共享内存段的key
$shmKey = 123;
//创建共享内存段
$shmId = shmop_open($shmKey,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,64);

//删除关闭共享内存段
shmop_delete($shmId);
shmop_close($shmId);
上述代码就会出现如下警告:
Warning: shmop_read(): no shared memory segment with an id of [4] in D:wwwroot
threaddemo6.php on line 13
PHP Warning: shmop_write(): no shared memory segment with an id of [4] in D:ww
wrootthreaddemo6.php on line 16
字面意思是无共享内存段,在new线程的过程中我们已经通过构造函数把$shmId传进去了,为什么会出现无共享内存段? 我们知道shmop_open函数成功创建共享内存段后会返回一个ID,该类型是int型。当我们把该ID传入到子线程中时,子线程是无法通过该ID找到共享内存段。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读