Atomic
swoole_atomic是swoole擴(kuò)展提供的原子計(jì)數(shù)操作類,可以方便整數(shù)的無(wú)鎖原子增減。
swoole_atomic
使用共享內(nèi)存,可以在不同的進(jìn)程之間操作計(jì)數(shù)swoole_atomic
基于gcc提供的CPU原子指令,無(wú)需加鎖swoole_atomic
在服務(wù)器程序中必須在swoole_server->start
前創(chuàng)建才能在Worker進(jìn)程中使用swoole_atomic
默認(rèn)使用32位無(wú)符號(hào)類型,如需要64有符號(hào)整型,可使用Swoole\Atomic\Long
注意:請(qǐng)勿在onReceive等回調(diào)函數(shù)中創(chuàng)建原子數(shù),否則底層的GlobalMemory內(nèi)存會(huì)持續(xù)增長(zhǎng),造成內(nèi)存泄漏。
使用
初始化計(jì)數(shù):
- int
init_value
初始值
public function __construct($init_value)
增加計(jì)數(shù):
- int
add_value
增加的值
public function add($add_value)
減少計(jì)數(shù):
- int
sub_value
減少的值
public function sub($sub_value)
獲取當(dāng)前計(jì)數(shù)的值:
public function get()
將當(dāng)前值設(shè)置為指定的數(shù)字:
- int
value
計(jì)數(shù)值
public function set($value)
如果當(dāng)前數(shù)值等于參數(shù)1,則將當(dāng)前數(shù)值設(shè)置為參數(shù)2:
- int
cmp_value
被做比較的值 - int
set_value
當(dāng)前數(shù)值等于被做比較的值后被設(shè)置為指定的計(jì)數(shù)值
public function cmpset($cmp_value, $set_value)
例子
在EasySwooleEvent
初始化函數(shù)注冊(cè)atomic對(duì)象。
// 注冊(cè)一個(gè)atomic對(duì)象
AtomicManager::getInstance()->add('second');
從AtomicManager獲取atomic對(duì)象并使用。
<?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.
}
}