Меня смущают результаты следующего упрощенного кода.
Потоковый объект 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