2014-01-28 3 views
1

У меня есть следующий PHP код:Share массив между Pthreads

<?php 

class StackableAr extends Stackable{ 
    public function run(){} 
} 

class MyThread1 extends Thread{ 

    public $settings; 

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

    public function run(){ 
     print "thread1: start\n"; 
     for($n = 0; $n < 8; $n++){ 
      print "thread1: $n\n"; 
      if($n == 2){ 
       print_r($this->settings); 
      } 
      elseif($n == 4){ 
       $this->settings['test2'] = new StackableAr(); 
       $this->settings['test2']['attr2'] = 'string2'; 
       $this->settings['test3'] = 'string3'; 
      } 
      elseif($n == 6){ 
       print_r($this->settings); 
      } 
      sleep(1); 
     } 
     print "thread1: end\n"; 
    } 
} 

class MyThread2 extends Thread{ 

    public $settings; 

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

    public function run(){ 
     print "thread2: start\n"; 
     for($n = 0; $n < 10; $n++){ 
      print "thread2: $n\n"; 
      if($n == 8){ 
       print_r($this->settings); 
      } 
      sleep(1); 
     } 
     print "thread2: end\n"; 
    } 
} 

$settings = new StackableAr(); 
$settings['test1'] = new StackableAr(); 
$settings['test1']['attr1'] = 'string1'; 

$myThread1 = new MyThread1($settings); 
$myThread2 = new MyThread2($settings); 

$myThread1->start(); 
$myThread2->start(); 

for($n = 0; $n < 12; $n++){ 
    print "main: $n\n"; 
    sleep(1); 
} 
?> 

Как я могу сделать $this->settings['test2'] сохраняться, даже если thread1 больше не существует. Я сделал это как pthread PHP example note говорит: Вы можете и должны использовать Stackable в качестве базового объекта для всех массивов, которые вы хотите передать другим направлениям
$this->settings['test3'] сохраняется после того, как thread1 закончился. Но почему не $this->settings['test2']?

ответ

2

Контекст, создавший объект, который является единственным местом, где объект действительно существует, исчез, и поэтому объект уничтожен.

Другие данные никогда не зависели от контекста, создавшего его, поскольку он имеет простой тип.

Когда вы проходите объекты вокруг потоков, вы должны обеспечить, чтобы контекст создания существовал до тех пор, пока объект делится, это верно для основного процесса и всех потоков, созданных этим процессом.

Дополнительная информация: https://gist.github.com/krakjoe/6437782

+0

Ok. Понимаю. Таким образом, это относится только к объектам, не предназначенным для строк? – TheFox

+1

Точнее, только объекты, которые спускаются с pthreads. Объекты, которые не спускаются с pthreads, сериализуются при хранении, поэтому их можно восстановить после того, как контекст, который их создал, исчез. –

Смежные вопросы