PHP7 pthreads3 горе: Невозможно увеличить публичное свойство класса Threaded из экземпляра объекта Worker - PullRequest
0 голосов
/ 07 ноября 2018

Меня смущают результаты следующего упрощенного кода.

Потоковый объект MyPool предназначен для создания экземпляра переменного числа объектов MyWorker. Поскольку каждый объект MyWorker правильно создается, он должен увеличивать $ counter внутри класса MyPool, чтобы отразить, сколько существует правильно созданных рабочих экземпляров.

При вызове изнутри объекта MyWorker функция incrementCounter (), по-видимому, выполняется (согласно выражению echo), но не влияет на свойство $ counter. Однако вызов того же самого из основного потока работает, как и ожидалось.

Как мне реализовать эту простую концепцию?

<?php

error_reporting(E_ALL & ~E_NOTICE);

class MyPool extends Threaded
{
    public static $counter;
    public $workers;

    public function __construct()
    {
        self::$counter = (int) 0;

        $workers[] = new MyWorker();
        $workers[] = new MyWorker();
        $workers[] = new MyWorker();

        $workers[0]->start();
        $workers[1]->start();
        $workers[2]->start();
    }

    public static function getCounter()
    {
        return self::$counter;
    }

    public static function increaseCounter()
    {
        self::$counter++;
        echo "counter has been increased inside MyPool\n";
    }
}

class MyWorker extends Worker
{
    public function __construct()
    {
    }

    public function run()
    {
        // do something then
        $this->WorkerActive();
    }

    public function WorkerActive()
    {
        MyPool::$counter++;
        MyPool::increaseCounter();
    }
}

$MyPool = new MyPool();

echo "counter = ".MyPool::$counter."\n";
echo "counter = ".$MyPool->getCounter()."\n";
echo "counter = ".MyPool::getCounter()."\n";

MyPool::$counter++;
MyPool::increaseCounter();

echo "counter = ".MyPool::$counter."\n";
echo "counter = ".$MyPool->getCounter()."\n";
echo "counter = ".MyPool::getCounter()."\n";

Вывод:

counter has been increased inside MyPool
counter has been increased inside MyPool
counter has been increased inside MyPool
counter = 0
counter = 0
counter = 0
counter has been increased inside MyPool
counter = 2
counter = 2
counter = 2

1 Ответ

0 голосов
/ 11 ноября 2018

В pthreads статические свойства являются локальными для потоков и не разделяются между потоками. Помочь будет переключение свойства $ counter в область объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...