0

フォークされた子供たちの間でメモリを共有する理由を見つけるのに何時間も何日も費やしphpましたが、フォークする前に親が関数にvarを設定すると、関数は常に子供に同じ結果を返すことがわかりました:~

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);、すべての子が同じ結果を返すことがわかります (子によって計算された最初の結果)。

私はそれに対処する方法がわかりません:(

4

1 に答える 1

1

これはメモリ共有とは関係ないと思います。の動作を見ているだけですrand

その行をコメントアウトすると、各子がrand初めて呼び出すため、それぞれが個別にシードされます。

その行のコメントを外すと、子がフォークされる前にrandシードされます。したがって、それらはすべて同じ種を見ます。

于 2013-01-18T12:02:21.737 に答える