Swoole 中使用 Atomic 实现进程间无锁计数器

Posted danhuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swoole 中使用 Atomic 实现进程间无锁计数器相关的知识,希望对你有一定的参考价值。

使用示例:

$atomic = new SwooleAtomic();

$serv = new SwooleServer(‘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();
    }
});

// 管理进程结束时触发,这时 Task 和 Worker 进程已结束运行,已被 Manager 进程回收
$serv->on("ManagerStop", function ($serv) {
    echo "shutdown
";
});

$serv->on("Receive", function () {

});

$serv->start();

服务器启动成功后,onStart/onManagerStart/onWorkerStart 会在不同的进程内并发执行。

onStart/onManagerStart/onWorkerStart 3 个事件的执行顺序是不确定的。

以上是关于Swoole 中使用 Atomic 实现进程间无锁计数器的主要内容,如果未能解决你的问题,请参考以下文章

为啥标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

为啥在已经使用 seq_cst CAS 的无锁队列中需要 atomic_thread_fence(memory_order_seq_cst)?

Java高并发之无锁与Atomic源码分析

可以/应该使用 SeqLock 实现非无锁原子吗?

在 C++11 中以无锁方式原子交换两个 std::atomic<T*> 对象?

ARM 上的 std::atomic<bool> 无锁不一致(树莓派 3)