1

I am confused by the results from the following simplified code.

A Threaded object MyPool is to instantiate a variable number of MyWorker objects. As each MyWorker object is correctly instantiated, it should increment the $counter inside the MyPool class, to reflect how many correctly instantiated workers there are.

When called from inside a MyWorker object, the increaseCounter() function appears to execute (as per echo statement), but has no affect on the $counter property. However calling the same from the main thread works as expected.

How do I implement this simple concept?

<?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";

The output is:

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 Answer 1

0

In pthreads static properties are thread-local and not shared between threads. Switch $counter property to object scope will help.

Not the answer you're looking for? Browse other questions tagged or ask your own question.