php多线程pthread的$thread->done是啥玩意啊?

暂停代码如下:

$this->synchronized(function($thread){
    if (!$thread->done)
        $thread->wait();
}, $this);

唤醒代码如下:

$my->synchronized(function($thread){
    $thread->done = true;
    $thread->notify();
}, $my);

那么......那个thread->done到底是个什么玩意?为什么我去掉了程序依然跑得通?
恳请各位大佬指点迷津。

阅读 2.6k
1 个回答

这里的done就是个普通的字段,和下面的用法其实是一样的,都是PHP的基本用法:

class A {
}

$a = new A();
$a->done = true;

Run

你的完整代码应该pthread里的实例吧:

<?php
class My extends Thread {
    public function run() {
        $this->synchronized(function($thread){
            if (!$thread->done)
                $thread->wait();
        }, $this);
    }
}
$my = new My();
$my->start();
$my->synchronized(function($thread){
    $thread->done = true;
    $thread->notify();
}, $my);
var_dump($my->join());

start()的时候开始在子线程里跑run(),这是done还没赋值,所以会执行wait()。而主线程接着会执行notofy()唤醒正在wait()的子线程。

另一种情况是主线程先对done赋值和执行notify(),然后再到子线程执行run(),这时子线程就不用wait了,因为主线程已经notify()了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题