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 回答