这是一个我不理解的简单例子:
<?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?
我在这里明显遗漏了一些东西
提前致谢
答案 0 :(得分:1)
答案 1 :(得分:1)
阅读本文:https://gist.github.com/krakjoe/6437782
你有两个问题,第一个classA不是线程安全的,如果你没有从pthreads下降它被设置为classB的成员时被序列化。如果classA确实从pthreads下降,当你将它写入classB时,你会失去真正的引用,而pthreads将不允许你访问相同的功能 - 它认为你在另一个线程中。
关键是“你负责创建的对象”,这意味着,如果你打算在线程之间共享一个对象,你必须在创建该对象的范围内保留对它的直接引用。