我是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一样。
谢谢。
答案 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
媒体资源和反序列化时,您必须始终牢记arrays
和Threaded
将序列化获得该财产时。
PS:使用strings
作为Threaded
属性也非常慢......