pthreads — Почему некоторые операции с массивами в PHP не работают?

У меня есть этот класс потока, который использует pthread Расширение PHP:

class Task extends Thread
{
protected $arr = array();

public function run()
{
$this->arr[] = 1;
$this->arr[] = 2;
$this->arr[] = 3;
var_dump($this->arr);
}
}
$thread = new Task();
$thread->start();
$thread->join();

Вывод необъяснимо показывает пустой массив. Кто-нибудь может кратко объяснить, почему?

0

Решение

У меня есть решение, но нет убедительного объяснения, поэтому больше ответов было бы очень желательно.

Вот мой Threaded ребенок (урезанный ради краткости):

class ObjectConstructorThreaded extends Threaded
{
protected $worker;
protected $className;
protected $parameters;
protected $objectKey;

public function __construct($className, $parameters)
{
$this->className = $className;
$this->parameters = $parameters;
}

public function setWorker(\Worker $worker)
{
$this->worker = $worker;
}

protected function getWorker()
{
return $this->worker;
}

public function run()
{
$reflection = new \ReflectionClass($this->className);
$instance = $reflection->newInstanceArgs($this->parameters);
$this->objectKey = $this->getWorker()->notifyObject($instance);
}

public function getObjectKey()
{
return $this->objectKey;
}
}

И Worker (снова обрезается):

class ObjectServer extends Worker
{
protected $count = 0;
protected $objects = array();

public function notifyObject($object)
{
$key = $this->generateHandle();

/*
// Weird, this does not add anything to the stack
$this->objects[$key] = $object;

// Try pushing - fail!
$this->objects[] = $object;

// This works fine? (but not very useful)
$this->objects = array($key => $object);
*/

// Try adding - also fine!
$this->objects = $this->objects + array($key => $object);

return $key;
}
}

Наконец, чтобы начать тему:

$thread = new ObjectServer();
$thread->start();
$threaded = new ObjectConstructorThreaded($className, $parameters);
$threaded->setWorker($this->worker);
$thread->stack($threaded);

Как вы можете видеть из настоящих комментариев, которые я написал в то время, попытки вставить или вставить в массив не увенчались успехом, но перезапись (установив его на фиксированное значение или объединение старого значения и новой записи), кажется, работает ,

Поэтому я считаю, что многопоточность делает нетривиальные типы (массивы и объекты) эффективно неизменяемыми, и что они могут быть только сброшены, но не изменены. У меня был такой же опыт с сериализуемыми классами тоже.

Относительно Зачем это тот случай, или, если есть лучший подход, я обновлю этот ответ, если узнаю!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]