pthread小测试

直接贴出来,来自PHP-Mannular下的note。

<?php
class My extends Thread
{
    public
        $array = array(‘default val 1‘, ‘default val 2‘),
        $msg = ‘default‘,
        $stop = false;

    public function run()
    {
        while(true)
        {
            echo $this->msg . PHP_EOL;
            if(count($this->array) > 0){
                foreach($this->array as $val){
                    var_dump($val);
                }
                $this->array = array();
            }
            /** cause this thread to wait **/
            $this->synchronized(
                function($thread){
                    if(count($this->array) < 1){
                        $thread->wait();
                    }
                },
                $this
            );
            echo PHP_EOL;
            if($this->stop){
                break;
            }
        } // while
    }
}
$my = new My();
$my->start();

sleep(1); // wait a bit

// test 1 - $thread->array[] = 1;
$my->synchronized(
    function($thread){
        $thread->msg = ‘test 1‘;
        $thread->array[] = 1;
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

// test 2 - array_push($thread->array, 2);
$my->synchronized(
    function($thread){
        $thread->msg = ‘test 2‘;
        array_push($thread->array, 2);
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

// test 3 - array_merge($thread->array, 3);
$my->synchronized(
    function($thread){
        $thread->msg = ‘test 3‘;
        $new = array(3);
        $thread->array = array_merge($thread->array, $new);
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

$my->stop = true;
?>
out:
default
string(13) "default val 1"
string(13) "default val 2"

test 1

test 2

test 3
int(3)

so in this case only array_merge() worked.

可以看到当时他对thread数组属性改变操作中,只有array_merge可以实现。不过这是一年前的例子,我用php7.0 + php_pthreads-3.1.6-7.0运行后,会报错误,连array_merge也无法实现。

PHP Fatal error: Uncaught RuntimeException: Threaded members previously set to Threaded objects are immutable, cannot overwrite array in D:\Apache24\htdocs\threadtest.php:166

PHP Warning: array_push() expects parameter 1 to be array, object given in D:\Apache24\htdocs\threadtest.php on line 206

PHP Warning: array_merge(): Argument #1 is not an array in D:\Apache24\htdocs\threadtest.php on line 219

我猜想应该是thread会自动将数组属性转换成obj类型,并且会获得一些继承的方法,因此无法用常规的处理array的函数对其进行操作,但比如 Threaded::pop,Threaded::shift,等都是可以使用的。

就像这样:

<?phpclass test extends thread{
    public $arr = array(1,2,3,4);

    public function run()
    {        var_dump($this->arr->pop());
        var_dump($this->arr->shift());
        var_dump($this->arr);

        //常规方法
        var_dump(array_pop($this->arr));
        var_dump(array_shift($this->arr));
    }

}

$a = new test();

$a->start();

?>

输出结果:
int(4)
int(1)
object(Volatile)#2 (2) {
  [1]=>
  int(2)
  [2]=>
  int(3)
}
PHP Warning:  array_pop() expects parameter 1 to be array, object given in D:\Apache24\htdocs\threadtest.php on line 161 NULL
PHP Warning:  array_shift() expects parameter 1 to be array, object given in D:\Apache24\htdocs\threadtest.php on line 162 NULL
时间: 2024-10-13 11:57:08

pthread小测试的相关文章

struts2 返回页面数据小测试

用户通过查询,后台得到查询数据,那么struts2这么把查询的数据,在页面显示?做个小测试. 创建项目 导入jar包(如果不知道导入哪些jar,参考前面章节)测试jar包为2.5 配置web.xml 写测试 项目结构图 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

[UNet]通过一个小测试了解Command和ClientRpc的功能

作者只是业余时间接触Unity 2个月的新人一枚,如有不对的地方,请各位大神指正! Unity 5.以后使用了新的网络模块UNet(其实我接触的晚压根没用过老的- -!),但是在使用过程中确实关于UNet的资料和讨论挺少的,于是自己做了个小项目测试了Command和ClientRpc两个命令. 首先我们看看官方给出的定义: Commands Commands are sent from player objects on the client to player objects on the s

[Python]threading local 线程局部变量小测试

概念 有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理.但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的.python threading模块中就提供了这么一个类,叫做local. 多线程中共享变量和局部变量的区别我画两个小图,简单描述下(作图能力一般,请见谅,概念性的东西大家可以google下,很多好文章) 全局变量 线程局部变量 对比: 下面是

Python下实现文件中的全文搜索小测试

username = 'test' password = '123456' while True: user_str = raw_input("Please input your name>>") pass_str = raw_input("Please input your password>>") if username != user_str or password != pass_str: print "Sorry,You 

[Gevent]gevent 网络抓取小测试

早就听说gevent基于事件的异步处理能力 效率多么高,一直在项目中也很少用到,今天先来没事就学习了些简单的用法. 有个官方的教程写的很不错 中文版的地址为:http://xlambda.com/gevent-tutorial/ 学习gevent很不错的资料. 具体的理论这里不怎么说了,只是有些了解,具体的原理还不能解释的很清楚.不过协程这种概念在golang里面很多. 写了一个访问网络,使用同步操作,gevent 和 多线程对比的例子. #!/usr/bin/python # -*- codi

(学习随笔)关于浮动元素换行机制的小测试

引言: 之前看了一篇张鑫旭老师的博文<关于文字内容溢出用点点点(-)省略号表示>.其中的他的"margin负值定位法"原理中的"当文字内容足够长时就把隐藏在上面的省略号层给挤下来了."着实研究了好久,才发现自己在浮动换行机制这方面的欠缺,同时又发现网上对这一机制并没有非常深入探讨的文章,所以自己来做个小测试研究下:) 正文: 在W3School里CSS教学中关于浮动的说明里,对于浮动元素的换行,说法只有一句"浮动的框可以向左或向右移动,直到它的

程序员心理小测试:你是否患上抑郁症?

前几天,华为又一员工跳楼,这多少给程序员的我们又一次心理上的警钟,我们不仅要多多注意自己的身体,也要时刻关心一下自己的心理问题,进行适当的调整. 从选择了计算机行业的那一刻起,我们就开始了与鼠标.键盘.显示器长期为伍的生活.多少程序员为了生存,终日坐在电脑面前埋头苦干,很少有时间去关心自己的身体状况和心理疾病.也正因为这样,程序员的健康状况和心理状况常常让人担忧.如果自己不注意,等到其中的危害表现出来时往往已经有些迟了. 作为程序员,所面临的心理压力的确是相当大的,开发任务的压力,项目进度的压力

hibernate 增删改查小测试

好久没有敲过了,来熟悉下hibernate,做了个小测试. 测试项目结构图,关于导入jar包,可以参考 http://zhuws.blog.51cto.com/11134439/1932652 2.hibernate.cfg.xml 配置 <!DOCTYPE hibernate-configuration PUBLIC         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"         "http://w

[工具]小测试和学习项目清单化框架

下载:Personal_Study_Assistant.zip 背景 实际中,我们可能要经常会对一些API或小核心代码不太确定,于是写一些小测试代码,如正则表达式测试.时间久了,这些小项目散落得到处都是,查找和整理起来都比较费时间. “工欲善其事,必先利其器”,下面让我们来解决一下这个问题吧. 程序的思路是: 1所有的测试文件统一归类存放于不同的Project; 2Project启动时,自动生成所有测试代码的清单,通过输入清单序号选择对应的测试来执行,不用更改Program的Main方法. (目