2013-01-18 57 views
0

我已經過了幾個小時和幾天找到爲什麼php分享我分叉的孩子和我之間的內存計算過,如果父母中一個函數分叉之前設置一個變量,然後該函數將始終返回〜PHP的分叉和內存共享我發瘋

new mytest; 
class mytest{ 
    var $t = 'Parent'; 
    public function __construct(){    
     //$this->runChildProcess($i);  

     $pidsCount = 0; 
     for($i = 0; $i < 5; $i++) { 
      $pids[$pidsCount] = pcntl_fork(); 
      if($pids[$pidsCount]) { 
       $this->t = 'Parent'; 
       // i am the parent 
       $pidsCount++; 
      } 
      else { 
       $this->t = 'Enfant'; 
       // i am the child 
       $this->runChildProcess($i); 
       exit(); 
      } 
     } 
     for($i = 0; $i < $pidsCount; $i++) { 
      pcntl_waitpid($pids[$i], $status, WUNTRACED); 
     } 
    } 

    function runChildProcess($i) { 
     $a = rand(0,100)."\n"; 
     echo $this->t.' : '.$a; 
    } 
} 

如果你運行這個示例它會很好,孩子們會輸出不同的數字。 但是,如果你取消註釋第一$this->runChildProcess($i);然後你會看到所有的孩子將返回相同的結果(由兒童計算的第一個)

我不知道如何處理是: (

回答

1

我不認爲這是什麼做的內存共享。你只是看到的rand行爲。

隨着該行註釋掉,每個孩子要求rand首次,所以每個獨立獲得種子

隨着該行註釋掉,然後rand是之前接種任何兒童被分叉。因此,他們都看到了相同的種子。

+0

該死的奧利你說得對!謝謝 – beunwa