PHP pthreads:无法在构造函数中正确创建对象

时间:2015-02-22 14:56:38

标签: php multithreading pthreads

我是PHP新手,我对扩展Thread的类有疑问。 我需要将构造函数参数中给出的对象存储到SplObjectStorage中,但我无法执行此操作。 即使在附加对象后,SplObjectStorage对象仍保持为空。

当我删除“extends Thread”时,它可以正常工作,但我需要使用线程。

以下是一个例子:

<?php

class MyClass extends Thread
{
    protected $variable;
    public function __constructor($object)
    {
        $this->variable = new \SplObjectStorage;
        $this->variable->attach($object);

        $storage = new \SplObjectStorage;
        $storage->attach($object);

        var_dump($this->variable); // shows empty SplObjectStorage
        var_dump($storage); // shows SplObjectStorage with $object inside it
        var_dump($object); // shows the object
    }
    public function run() {}
}

你有个主意吗? 我想$ this-&gt;变量就像附件后的$ storage一样。

谢谢。

1 个答案:

答案 0 :(得分:0)

PHP pthreads的作者已经在Stack Overflow上多次answered this

不扩展Threaded的对象不被视为线程安全,因此被pthreads序列化/复制。

您可以在运行时使用Threaded::extend()从普通类创建“线程安全”类。但要非常小心。底层实现可能不是线程安全的。 (顺便说一下,SplObjectStorage在这里失败了。)

我担心你必须在本地创建/使用SplObjectStorage线程。

protected static $variable; // will be NULL in thread's context

好的,我必须在这里纠正自己。我自己还在学习pthreads。

实际上,您可以将普通对象用作类属性。但你必须在某种程度上非常规地访问它们(而且速度不是很快):

$storage = new \SplObjectStorage;
$storage->attach($object);
$this->variable = $storage; // object gets serialized

$storage = $this->variable // object gets unserialized

// work with $storage normally...

// ...and write it back:
$this->variable = $storage

另请注意,使用上述技术时,您正在使用副本。在您将对象写回之前,其他线程不会看到更改。您可能希望在此使用Threaded::synchronized()

设置objects媒体资源和反序列化时,您必须始终牢记arraysThreaded序列化获得该财产时。

PS:使用strings作为Threaded属性也非常慢......