当原子计数的值为0
时程序进入等待状态。另外一个进程调用wakeup
可以再次唤醒程序。底层基于Linux Futex
实现,使用此特性,可以仅用4
字节内存实现一个等待、通知、锁的功能。
function swoole_atomic->wait(float $timeout = -1) : bool
在不支持
Futex
的平台下,底层会使用循环usleep(1000)
模拟实现
$timeout
指定超时时间,默认为-1
,表示永不超时,会持续等待直到有其他进程唤醒false
,错误码为EAGAIN
,可使用swoole_errno
函数获取true
,表示有其他进程通过wakeup
成功唤醒了当前的锁wait/wakeup
特性时,原子计数的值只能为0
或1
,否则会导致无法正常使用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";
}