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
初始值
public function __construct($init_value)
增加計數:
- int
add_value
增加的值
public function add($add_value)
減少計數:
- int
sub_value
減少的值
public function sub($sub_value)
獲取當前計數的值:
public function get()
將當前值設置為指定的數字:
- int
value
計數值
public function set($value)
如果當前數值等于參數1,則將當前數值設置為參數2:
- int
cmp_value
被做比較的值 - int
set_value
當前數值等于被做比較的值后被設置為指定的計數值
public function cmpset($cmp_value, $set_value)
例子
在EasySwooleEvent
初始化函數注冊atomic對象。
// 注冊一個atomic對象
AtomicManager::getInstance()->add('second');
從AtomicManager獲取atomic對象并使用。
<?php
/**
* Created by PhpStorm.
* User: Tioncico
* Date: 2019/3/18 0018
* Time: 15:39
*/
namespace App\HttpController;
use EasySwoole\Component\AtomicManager;
use EasySwoole\Http\AbstractInterface\Controller;
class Index extends Controller
{
function index()
{
AtomicManager::getInstance()->add('second',0);
$atomic = AtomicManager::getInstance()->get('second');
$atomic->add(1);
$this->response()->write($atomic->get());
// TODO: Implement index() method.
}
}