Atomic

swoole_atomic是swoole扩展提供的原子计数操作类,可以方便整数的无锁原子增减。

  • swoole_atomic使用共享内存,可以在不同的进程之间操作计数
  • swoole_atomic基于gcc提供的CPU原子指令,无需加锁
  • swoole_atomic在服务器程序中必须在swoole_server->start前创建才能在Worker进程中使用
  • swoole_atomic默认使用32位无符号类型,如需要64有符号整型,可使用Swoole\Atomic\Long

注意:请勿在onReceive等回调函数中创建原子数,否则底层的GlobalMemory内存会持续增长,造成内存泄漏。

使用

初始化计数:

  • int init_value 初始值
  1. public function __construct($init_value)

增加计数:

  • int add_value 增加的值
  1. public function add($add_value)

减少计数:

  • int sub_value 减少的值
  1. public function sub($sub_value)

获取当前计数的值:

  1. public function get()

将当前值设置为指定的数字:

  • int value 计数值
  1. public function set($value)

如果当前数值等于参数1,则将当前数值设置为参数2:

  • int cmp_value 被做比较的值
  • int set_value 当前数值等于被做比较的值后被设置为指定的计数值
  1. public function cmpset($cmp_value, $set_value)

例子

EasySwooleEvent初始化函数注册atomic对象。

  1. // 注册一个atomic对象
  2. AtomicManager::getInstance()->add('second');

从AtomicManager获取atomic对象并使用。

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Tioncico
  5. * Date: 2019/3/18 0018
  6. * Time: 15:39
  7. */
  8. namespace App\HttpController;
  9. use EasySwoole\Component\AtomicManager;
  10. use EasySwoole\Http\AbstractInterface\Controller;
  11. class Index extends Controller
  12. {
  13. function index()
  14. {
  15. AtomicManager::getInstance()->add('second',0);
  16. $atomic = AtomicManager::getInstance()->get('second');
  17. $atomic->add(1);
  18. $this->response()->write($atomic->get());
  19. // TODO: Implement index() method.
  20. }
  21. }