Atomic

Notice: ext-swoole is supported until v4.7.1, use ext-openswoole >= v4.7.1. Latest version: pecl install openswoole-4.8.1

Atomic can be used for inter-process variable synchronization.

The integer variable defined with Atomic allows multiple processes access and update it. It is implemented based on CPU atomic instructions. You can use it to implement a high performance counter service with multiple Worker.

The underlayer implementation is CAS: Compare-and-swap (CAS) is an atomic instruction used in multi-threading to achieve synchronization. It compares the contents of a memory location with a given value and, only if they are the same, modifies the contents of that memory location to a new given value.

Methods

Notice

  • The Atomic variables have to created before Swoole\Server->start. Then you can access and update it within Worker.
  • You should not define or create a new Atomic within server callbacks like request, receive etc.
  • The integer type is a Int32, but your can use new Swoole\Atomic\Long to create Int64 type.
  • wait and wakeup method is not supported for Swoole\Atomic\Long

Examples

<?php
$counter = new Swoole\Atomic(123);
echo $counter->add(12)."\n";
echo $counter->sub(11)."\n";
echo $counter->cmpset(122, 999)."\n";
echo $counter->cmpset(124, 999)."\n";
echo $counter->get()."\n";
<?php
$counter = new Swoole\Atomic();
$server = new Swoole\Server('127.0.0.1', '9501');
$server->set([
    'worker_num' => 1,
    'log_file' => '/dev/null'
]);
$server->on("start", function ($server) use ($counter) {
    if ($counter->add() == 10) {
        $server->shutdown();
    }
});
$server->on("receive", function () use ($counter) {
    $counter->add();
});
$server->start();