2013-06-16 4 views
1

Как получить доступ к переменному массиву с помощью PTHREAD, я создал имена классов резьбы «AccessVariable», whoose задача состоит в том, чтобы создать 4 потока и получить доступ к массиву с именем «$ обр», нужен указатель на том, как успешно достичь этого, как я очень нового в этой кодировкеPHP mutilthreading доступ массив переменных

<?php 
error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', true); 
class AccessVariable extends Thread { 
    public $arr = array("12","33","21","3211","3214","34","23423"); 
    public function __construct($arg) { 
     $this->arg = $arg; 
    } 
    public function run() { 
     if ($this->arg) { 
      $tmp_value = $this->getValue(); 
      printf('%s: %s %d -finish' . "\n", date("g:i:sa"), $this->arg, $tmp_value); 
     } 
     $this->synchronized(function($thread) { 
        $thread->getValue(); 
       }, $this); 
    } 
    public function getValue() { 
     //Get Array Variable 
    } 
} 
// Create a array 
$stack = array(); 
//Iniciate Miltiple Thread 
foreach (range("A", "D") as $i) { 
    $stack[] = new AccessVariable($i); 
} 
// Start The Threads 
foreach ($stack as $t) { 
    $t->start(); 
} 
?> 

ответ

2

некоторых наблюдениях вы найдете полезным:

  • входа класса по умолчанию не поддерживается - Зенд имеет обработчик объектов но обработчики записей, когда запись объявляется обработчиками объектов, явно не подходят для вызова при работе с экземплярами. Чтобы обойти это, задайте значения по умолчанию в конструкторах.
  • Переменные, предназначенные для совместного использования между несколькими контекстами, должны расширять определение pthreads; Объекты pthreads функционируют как объекты, а также ассоциативные массивы и индексированные списки, реализация PHP по умолчанию для этих целей не готова для многопоточности.
  • Синхронизация по объекту применима только в том случае, если вы намерены использовать методы синхронизации в синхронизированном блоке (закрытие/функция в php); синхронизировать только если вы собираетесь ждать, или предупредить другое ожидание и объект

-

<?php 
error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', true); 

class SharedArray extends Stackable { 
    public function __construct($array) { 
     $this->merge($array); 
    } 

    public function run(){} 
} 


class AccessSharedArray extends Thread { 
    public $shared; 
    public $arg; 

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

    public function run() { 
     if ($this->arg) { 
      $tmp_value = $this->shared[$this->arg]; 
      printf('%s: %s %d -finish' . "\n", date("g:i:sa"), $this->arg, $tmp_value); 
     } 
    } 
} 

$shared = new SharedArray(
    array("12","33","21","3211","3214","34","23423")); 
// Create a array 
$stack = array(); 

foreach (range(0, 3) as $i) { 
    $stack[] = new AccessSharedArray($shared, $i); 
} 

// Start The Threads 
foreach ($stack as $t) { 
    $t->start(); 
} 

foreach ($stack as $t) 
    $t->join(); 
?> 

Есть много примеров на GitHub и включенных в дистрибутиве, чтобы помочь вам узнать Pthreads хорошо достаточно, чтобы использовать его. Многопоточность не похожа на использование новой базы данных или клиента http. Это сложный и мощный, я умоляю вас внимательно и полностью прочитать каждый пример, даже если вы считаете, что это не имеет отношения к задаче; знание хорошо вам поможет.

В дополнение к примерам в отчетах об ошибках в github есть много информации, поэтому, если у вас есть проблема, и, похоже, не существует решения в примере, то найдите список проблем на github, прежде чем сообщать о любых ошибках ,

+0

Ваш образец кода делает cli невосприимчивым в окнах – Cunning

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