线程PHP中的全局增量


Global incremen in thread PHP

我正在同时运行4个线程。(在这种情况下,线程同时运行work()函数)

global $i;
$i = 1;
function work($address) {
    while($i < 1000) {
        $i++;
        ----
        if($i == something) some job... 
        ----
    }
}

出于某种原因,这不起作用。线程有时会在while中执行相同的循环,所以我稍后会有一些重复的值。(可能他们有一些关键部分)知道怎么解决这个问题吗?

计数器对象必须是线程安全的,它还必须使用同步方法。

以下是此类代码的示例:

<?php
class Counter extends Threaded {
    public function __construct($value = 0) {
        $this->value = $value;
    }
    /** protected methods are synchronized in pthreads **/
    protected function increment() { return ++$this->value; }
    protected function decrement() { return --$this->value; }
    protected $value;
}
class My extends Thread {
    /** all threads share the same counter dependency */
    public function __construct(Counter $counter) {
        $this->counter = $counter;
    }
    /** work will execute from job 1 to 1000, and no more, across all threads **/        
    public function run() {
        while (($job = $this->counter->increment()) <= 1000) {
            printf("Thread %lu doing job %d'n", 
                Thread::getCurrentThreadId(), $job);
        }
    }
    protected $counter;
}
$counter = new Counter();
$threads = [];
while (($tid = count($threads)) < 4) {
    $threads[$tid] = new My($counter);
    $threads[$tid]->start();
}
foreach ($threads as $thread)
    $thread->join();
?>

work()似乎是多余的,这个逻辑很可能应该在::run函数中。