Работая недавно с расширением pthreads, я обнаружил аномалию. У меня есть простой объект с внутренним состоянием:
class Sum {
private $value = 0;
public function add($inc) { $this->value += $inc; }
public function getValue() { return $this->value; }
}
Теперь я создал класс Thread, который что-то делает с этим объектом:
class MyThread extends Thread {
private $sum;
public function __construct(Sum $sum) {
$this->sum = $sum;
}
public function run(){
for ($i=0; $i < 10; $i++) {
$this->sum->add(5);
echo $this->sum->getValue() . " ";
}
}
}
В моей основной функции я создал объект Sum, ввел его в поток и начал его:
$sum = new Sum();
$thread = new MyThread($sum);
$thread->start();
$thread->join();
echo $sum->getValue();
Я ожидал, что результатом будет 50
, потому что поток должен был увеличить значение 10 раз на 5. Но я получил 0
!
Более любопытно, что синхронизация не обратно в основной поток не удалась, но поток даже, кажется, забыл о своем внутреннем состоянии на пути: выход эха внутри метода run()
не является ожидаемым 5 10 15 20 25 30 35 40 45 50
но 0 0 0 0 0 0 0 0 0 0
. Никто не вмешивается в поток - почему он не сохраняет свое состояние?
Боковое примечание: если я не запускаю поток, а вместо этого вызываю метод run() непосредственно в основном потоке ($thread->run();
), результат остается тем же. Но если теперь удалить extends Thread
в объявлении класса, он отлично работает и возвращает ожидаемый 5 10 15 20 25 30 35 40 45 50
.