在php中使用线程,没有理解行为

时间:2013-11-10 16:12:27

标签: php multithreading pthreads

这是一个我不理解的简单例子:

<?php

class classA {

    private $z = 1;

    public function __construct() {
        $this->b = new classB;
        $this->b->setRefonClassA($this);
        $this->b->start();
    }

    function changeZ() {
        echo "ChangeZ : z=" . $this->z . "\n";
        $this->z = 666;
        echo "ChangeZ : z=" . $this->z . "\n";
    }

    function showZ() {
        echo "showZ : z=" . $this->z . "\n";
    }

}

class classB extends Thread {

    function setRefOnClassA($classA) {
        $this->classA = $classA;
    }

    function run() {
        $this->classA->changeZ();
        $this->classA->showZ();
    }

}

$ test = new classA(); ?&GT;

结果是:

ChangeZ : z=1  
ChangeZ : z=666  
showZ : z=1  

我原以为showZ = 666。为什么z = 1?
我在这里明显遗漏了一些东西 提前致谢

2 个答案:

答案 0 :(得分:1)

你能尝试从Stackable扩展classA吗?

存在类似的问题:

pthread Thread objects reset their state

答案 1 :(得分:1)

阅读本文:https://gist.github.com/krakjoe/6437782

你有两个问题,第一个classA不是线程安全的,如果你没有从pthreads下降它被设置为classB的成员时被序列化。如果classA确实从pthreads下降,当你将它写入classB时,你会失去真正的引用,而pthreads将不允许你访问相同的功能 - 它认为你在另一个线程中。

关键是“你负责创建的对象”,这意味着,如果你打算在线程之间共享一个对象,你必须在创建该对象的范围内保留对它的直接引用。