Atomic->wait

当原子计数的值为0时程序进入等待状态。另外一个进程调用wakeup可以再次唤醒程序。底层基于Linux Futex实现,使用此特性,可以仅用4字节内存实现一个等待、通知、锁的功能。

function Atomic->wait(float $timeout = 1.0) : bool

在不支持Futex的平台下,底层会使用循环usleep(1000)模拟实现

  • $timeout 指定超时时间,默认为1秒。设置为-1时表示永不超时,会持续等待直到有其他进程唤醒
  • 超时返回false,错误码为EAGAIN,可使用swoole_errno函数获取
  • 成功返回true,表示有其他进程通过wakeup成功唤醒了当前的锁
  • 使用wait/wakeup特性时,原子计数的值只能为01,否则会导致无法正常使用
  • 当然原子计数的值为1时,表示不需要进入等待状态,资源当前就是可用。wait函数会立即返回true

使用方法

$n = new Swoole\Atomic;
if (pcntl_fork() > 0) {
    echo "master start\n";
    $n->wait(1.5);
    echo "master end\n";
} else {
    echo "child start\n";
    sleep(1);
    $n->wakeup();
    echo "child end\n";
}