线程中的指针不起作用

时间:2014-09-17 11:07:50

标签: php multithreading pointers pthreads

我在使用指针添加数组中的新元素时遇到问题。

thread.php:

class Process extends Thread {

public function __construct(&$list )
{
    $this->list = $list;
}

public function run() { 

    while ((1000 <= count($this->list))) {
        print_r($list) // array("one", "two");
        listing($this->list);
        print_r($list) // still array("one", "two");
    }
}
}

的index.php:

$links = array("one", "two");

function addNew(&$list)
{
    // some job
    array_push($list, "three");
    print_r($list) // array("one", "two","three");
}
function work(&$list)
{
     // some code...

        addNew($list);
}

$jobs = array(
    new Process($list),
    new Process($list),
    new Process($list)
);

foreach ($jobs as $job)
    $job->start();

链接的值将始终只是(&#34;一个&#34;,&#34;两个&#34;),无论我稍后在函数addNew()中添加的元素如何。

我需要指针,因为这将使用大量元素循环很多次,并且我不想创建总是新的数组。

1 个答案:

答案 0 :(得分:1)

您不被允许使用引用的原因,即使是不需要序列化的类型,也是因为如果您被允许这样做,就没有机会提供安全性......

请考虑以下事项:

$this->member = $data;

目前,这是对Threaded对象的原子写入,并且:

$data = $this->member;

原子阅读。

如果这些操作不是原子操作,请考虑如果某个其他线程调用第一个代码示例而另一个线程调用第二个代码,$data最多将是垃圾并且最坏时会产生错误。

考虑如果允许引用并且以下代码有效:

$data =& $this->member;

提及数据的上下文将被允许打破安全,没有机会进行干预,以这种方式编写线程将非常困难。

高级线程API的美妙之处在于您不必担心安全问题,它是为您提供的,不要寻找方法来打破安全性必须提供良好的建议。

所有Threaded对象的行为就像它们是一个数组一样,安装了pop和operator等实用程序方法,以便代码可以将它们视为一个数组。

线程对象没有序列化,它们是安全的,你仍然不能使用引用,但你也不需要:

<?php
class Shared extends Threaded {}

class Appender extends Thread {

    public function __construct(Shared $shared) {
        $this->shared = $shared;
    }

    public function run() {
        while (count($this->shared) < 1000) {
            $this->shared[] = 
                count($this->shared);
        }
    }

    protected $shared;
}

class Shifter extends Thread {

    public function __construct(Shared $shared) {
        $this->shared = $shared;
    }

    public function run() {
        while(count($this->shared)) {
            var_dump($this->shared->shift());
        }
    }
}

$shared   = new Shared();

$appender = new Appender($shared);
$shifter  = new Shifter($shared);

$appender->start();
$shifter->start();

$appender->join();
$shifter->join();
?>

上面的代码在另外两个线程之间共享一个类Shared对象,作为一个简单的例子,一个线程正在推动,另一个线程从同一个数组转移,安全。

除了使用Threaded对象之外,这个示例代码并不是一个很好的例子,就像它们是数组一样。