PHP线程是否按顺序运行?

时间:2017-03-29 14:10:09

标签: php multithreading pthreads

我做了所有的工作来自定义构建php并支持pthread。我稍微编辑了以下代码:http://php.net/manual/en/class.thread.php

class workerThread extends Thread {
public function __construct($i){
  $this->i=$i;
  $this->c=0;
}

public function run(){
while($this->c < 10){
   echo $this->i , '<br/>';
   sleep(1);
   $this->c++;
}
}
}

for($i=0;$i<50;$i++){
$workers[$i]=new workerThread($i);
$workers[$i]->start();
}

输出不是我所期望的,其中所有结果都按顺序排列:0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3等。

我是否误解了线程应该如何工作?是不是睡眠(1)应该允许另一个线程控制处理器并执行它的计算?

1 个答案:

答案 0 :(得分:0)

不,PHP的pthreads扩展创建的线程不会按顺序运行。它们是实际的内核线程,因此它们将运行,但内核的任务调度程序决定运行它们。

  

是不是sleep(1)应该允许另一个线程控制处理器并执行它的计算?

鉴于PHP中的sleep()函数使用了睡眠系统调用,以下描述from wikipedia适用:

  

Sleep会导致线程或进程放弃其剩余的时间片,并在指定的持续时间内保持Not Runnable状态。虽然通常保证最短的时间段,但没有严格的保证,一旦指定的时间过去,线程将立即或很快,甚至根本不会运行。这取决于调度程序的自由裁量权,并依赖于线程优先级和实现细节,例如睡眠线程将再次运行时的计时器分辨率。