php pthreads: передать объект родителю - PullRequest
0 голосов
/ 14 ноября 2018

Я заметил, что не могу использовать объекты, созданные в дочернем потоке в родительском потоке.

Допустим, внутри синхронизированной функции в классе, который расширяет поток, я создаю объект, исвойство:

$this->hit = true;
$this->synchronized
(
    function () 
    {
        $this->obj = new stdClass;
        $this->obj->result = "you have a result in an object.";
        $this->result = "you have a result in a property."
        $this->wait();
        $this->hit = false;
    }
);

... и затем я пытаюсь получить его на другой стороне синхронизированной функции в родительском потоке:

if ($job->hit)
{
    $job->synchronized
    (
        function ($job) 
        {
            $job->notify();
            echo $job->obj->result . "^^^Getting object created in child thread doesn't work for some reasons^^^.\n\n";
            echo $job->result . ", and that's ok.\n";
        }, 
        $job
    );
}

Следующее будет жаловаться:

Примечание PHP: Попытка получить свойство необъекта в /srv/cordmon/src/SleepThread.php в строке 71 ^^^ Получение объекта, созданного в дочернем потоке, не работает по некоторым причинам ^^^.

У вас есть результат в свойстве, и это нормально.

Я сделал несколько попыток, которые я не буду перечислять здесь для краткости,но я не могу вывести объект из дочерних потоков в родительский поток.Другие типы данных не представляют этой проблемы, и поэтому я представляю, что могу получить то, что мне нужно, от массивов в реальном мире.

Тем не менее, мне интересно, почему это так, и если есть правильный путьделать то, что я пытаюсь.Я знаю, что потоки не входят в основную область, и я знаю, что анонимные функции также имеют свою собственную область, но я предполагаю, что должен быть способ (кроме, например, использования json_encode / _decode или подобных обходных путей).

Заранее спасибо.

...