swoole_atomic->wait
最后更新于:2022-04-02 06:32:26
# swoole\_atomic->wait
[TOC]
当原子计数的值为`0`时程序进入等待状态。另外一个进程调用`wakeup`可以再次唤醒程序。底层基于`Linux Futex`实现,使用此特性,可以仅用`4`字节内存实现一个等待、通知、锁的功能。
~~~
function swoole_atomic->wait(float $timeout = 1.0) : bool
~~~
> 在不支持`Futex`的平台下,底层会使用循环`usleep(1000)`模拟实现
* `$timeout`指定超时时间,默认为`1秒`。设置为`-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";
}
~~~
';