• Atomic
    • 使用
    • 例子

    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. }