Atomic 是 Swoole 底层提供的原子计数操作类,可以方便整数的无锁原子增减。原子计数器有如下特点:
- 使用共享内存,可以在不同的进程之间操作计数
- 基于 gcc/clang 提供的 CPU 原子指令,无需加锁
- 在服务器程序中必须在 Server->start 前创建才能在 Worker 进程中使用
- 默认使用 32 位无符号类型,如需要 64 有符号整型,可使用 Swoole\Atomic\Long
注意:
- 请勿在 onReceive 等回调函数中创建计数器,否则内存会持续增长,造成内存泄漏。
- 支持 64 位有符号长整型原子计数,需要使用 new Swoole\Atomic\Long 来创建。Atomic\Long 不支持 wait 和 wakeup 方法。
完整代码示例:
$atomic = new Swoole\Atomic();
$serv = new Swoole\Server('127.0.0.1', '9501');
$serv->set([
'worker_num' => 1,
'log_file' => '/dev/null'
]);
$serv->on("start", function ($serv) use ($atomic) {
if ($atomic->add() == 2) {
$serv->shutdown();
}
});
$serv->on("ManagerStart", function ($serv) use ($atomic) {
if ($atomic->add() == 2) {
$serv->shutdown();
}
});
$serv->on("ManagerStop", function ($serv) {
echo "shutdown\n";
});
$serv-

文章介绍了Swoole底层的Atomic类,用于实现整数的无锁原子增减,强调其在不同进程间共享内存、基于CPU原子指令以及在服务器程序中的使用限制。同时提醒注意内存泄漏问题和64位长整型的使用。示例代码展示了Atomic的构造、增加、减少、获取、设置和等待唤醒等方法的用法,但指出Atomic操作可能存在更新丢失的问题。
最低0.47元/天 解锁文章
1561

被折叠的 条评论
为什么被折叠?



