0

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

<?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(); ?>

结果是:

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

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

4

2 回答 2

1

您可以尝试从 Stackable 扩展 classA 吗?

有一个类似的问题:

pthread 线程对象重置它们的状态

于 2013-11-10T16:52:57.453 回答
1

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

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

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

于 2013-11-11T07:39:25.077 回答