PHP7 pthreads3 горе: не удалось увеличить открытое свойство класса Threaded из экземпляра объекта Worker

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

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

Когда вызывается из объекта MyWorker, кажется, что функция IncreCounter () выполняется (согласно эхо-выражению), но не влияет на свойство $ 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

Решение

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

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector