mutex YII怎么用?yii源碼解析之mutex
Mutex組件允許并發進程的相互執行,以防止“競爭條件”。這是通過使用“鎖定”機制實現的。每個可能并發的線程通過在訪問相應數據之前獲取鎖來進行協作。
相關推薦:yii教程
用法示例:
if?($mutex->acquire($mutexName))?{ ????//?business?logic?execution }?else?{ ????//?execution?is?blocked! }
這是一個基類,應該擴展它以實現實際的鎖機制。
下面我們看看其源碼實現:
<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yiimutex; use yiibaseComponent; /** * The Mutex component allows mutual execution of concurrent processes in order to prevent "race conditions". * * This is achieved by using a "lock" mechanism. Each possibly concurrent thread cooperates by acquiring * a lock before accessing the corresponding data. * * Usage example: * * ``` * if ($mutex->acquire($mutexName))?{ ?*?????//?business?logic?execution ?*?}?else?{ ?*?????//?execution?is?blocked! ?*?} ?*?``` ?* ?*?This?is?a?base?class,?which?should?be?extended?in?order?to?implement?the?actual?lock?mechanism. ?* ?*?@author?resurtm?<resurtm> ?*?@since?2.0 ?*/ abstract?class?Mutex?extends?Component { ????/** ?????*?@var?bool?whether?all?locks?acquired?in?this?process?(i.e.?local?locks)?must?be?released?automatically ?????*?before?finishing?script?execution.?Defaults?to?true.?Setting?this?property?to?true?means?that?all?locks ?????*?acquired?in?this?process?must?be?released?(regardless?of?errors?or?exceptions). ?????*/ ????public?$autoRelease?=?true;//是否自動釋放鎖 ? ????/** ?????*?@var?string[]?names?of?the?locks?acquired?by?the?current?PHP?process. ?????*/ ????private?$_locks?=?[];//當前進程擁有的鎖信息 ? ? ????/** ?????*?初始化Mutex組件 ?????*/ ????public?function?init() ????{ ????????if?($this->autoRelease)?{//如果是自動釋放鎖 ????????????$locks?=?&$this->_locks; ????????????//注冊shutdown回調函數,在這里做鎖的釋放動作 ????????????register_shutdown_function(function?()?use?(&$locks)?{ ????????????????foreach?($locks?as?$lock)?{ ????????????????????$this->release($lock); ????????????????} ????????????}); ????????} ????} ? ????/** ?????*?Acquires?a?lock?by?name. ?????*?@param?string?$name?of?the?lock?to?be?acquired.?Must?be?unique. ?????*?@param?int?$timeout?time?(in?seconds)?to?wait?for?lock?to?be?released.?Defaults?to?zero?meaning?that?method?will?return ?????*?false?immediately?in?case?lock?was?already?acquired. ?????*?@return?bool?lock?acquiring?result. ?????*/ ????public?function?acquire($name,?$timeout?=?0)//按名稱獲取鎖 ????{ ????????if?($this->acquireLock($name,?$timeout))?{ ????????????$this->_locks[]?=?$name; ? ????????????return?true; ????????} ? ????????return?false; ????} ? ????/** ?????*?Releases?acquired?lock.?This?method?will?return?false?in?case?the?lock?was?not?found. ?????*?@param?string?$name?of?the?lock?to?be?released.?This?lock?must?already?exist. ?????*?@return?bool?lock?release?result:?false?in?case?named?lock?was?not?found.. ?????*/ ????public?function?release($name)//按名稱釋放鎖 ????{ ????????if?($this->releaseLock($name))?{ ????????????$index?=?array_search($name,?$this->_locks); ????????????if?($index?!==?false)?{ ????????????????unset($this->_locks[$index]); ????????????} ? ????????????return?true; ????????} ? ????????return?false; ????} ? ????/** ?????*?This?method?should?be?extended?by?a?concrete?Mutex?implementations.?Acquires?lock?by?name. ?????*?@param?string?$name?of?the?lock?to?be?acquired. ?????*?@param?int?$timeout?time?(in?seconds)?to?wait?for?the?lock?to?be?released. ?????*?@return?bool?acquiring?result. ?????*/ ????abstract?protected?function?acquireLock($name,?$timeout?=?0);//抽象函數,按名稱獲取鎖 ? ????/** ?????*?This?method?should?be?extended?by?a?concrete?Mutex?implementations.?Releases?lock?by?given?name. ?????*?@param?string?$name?of?the?lock?to?be?released. ?????*?@return?bool?release?result. ?????*/ ????abstract?protected?function?releaseLock($name);//抽象函數,按名稱釋放鎖 }</resurtm>
其作為基礎類,子類需要實現acquireLock和releaseLock方法,即具體的加鎖和解鎖策略。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END