php 信号量 关闭,php 信号量
一些理論基礎:
信號量:又稱為信號燈、旗語 用來解決進程(線程同步的問題),類似于一把鎖,訪問前獲取鎖(獲取不到則等待),訪問后釋放鎖。
臨界資源:每次僅允許一個進程訪問的資源。
臨界區:每個進程中訪問臨界資源的那段代碼叫臨界區
進程互斥:兩個或以上的進程不能同時進入關于同一組共享變量的臨界區域,即一個進程正在訪問臨界資源,另一個進程要想訪問必須等待。
進程同步主要研究如何確定數個進程之間的執行順序和避免數據競爭的問題 即,如何讓多個進程能一塊很好的協作運行
舉例子:(來源百科)
以一個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
$key=ftok(__FILE__,'t');
/**
* 獲取一個信號量資源
int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]]
$max_acquire:最多可以多少個進程同時獲取信號
$perm:權限 默認 0666
$auto_release:是否自動釋放信號量
*/
$sem_id=sem_get($key);
#獲取信號
sem_acquire($seg_id);
//do something 這里是一個原子性操作
//釋放信號量
sem_release($seg_id);
//把次信號從系統中移除
sem_remove($sem_id);
//可能出現的問題
$fp = sem_get(fileinode(__DIR__), 100);
sem_acquire($fp);
$fp2 = sem_get(fileinode(__DIR__), 1));
sem_acquire($fp2);
Implementation of a read-write semaphore in PHP:
class rw_semaphore {
const READ_ACCESS = 0;
const WRITE_ACCESS = 1;
/**
* @access private
* @var resource - mutex semaphore
*/
private $mutex;
/**
* @access private
* @var resource - read/write semaphore
*/
private $resource;
/**
* @access private
* @var int
*/
private $writers = 0;
/**
* @access private
* @var int
*/
private $readers = 0;
/**
* Default constructor
*
* Initialize the read/write semaphore
*/
public function __construct() {
$mutex_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'm');
$resource_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'r');
$this->mutex = sem_get($mutex_key, 1);
$this->resource = sem_get($resource_key, 1);
}
/**
* Destructor
*
* Remove the read/write semaphore
*/
public function __destruct() {
sem_remove($this->mutex);
sem_remove($this->resource);
}
/**
* Request acess to the resource
*
* @param int $mode
* @return void
*/
private function request_access($access_type = self::READ_ACCESS) {
if ($access_type == self::WRITE_ACCESS) {
sem_acquire($this->mutex);
/* update the writers counter */
$this->writers++;
sem_release($this->mutex);
sem_acquire($this->resource);
} else {
sem_acquire($this->mutex);
if ($this->writers > 0 || $this->readers == 0) {
sem_release($this->mutex);
sem_acquire($this->resource);
sem_acquire($this->mutex);
}
/* update the readers counter */
$this->readers++;
sem_release($this->mutex);
}
}
private function request_release($access_type = self::READ_ACCESS) {
if ($access_type == self::WRITE_ACCESS) {
sem_acquire($this->mutex);
/* update the writers counter */
$this->writers--;
sem_release($this->mutex);
sem_release($this->resource);
} else {
sem_acquire($this->mutex);
/* update the readers counter */
$this->readers--;
if ($this->readers == 0)
sem_release($this->resource);
sem_release($this->mutex);
}
}
/**
* Request read access to the resource
*
* @return void
*/
public function read_access() { $this->request_access(self::READ_ACCESS); }
/**
* Release read access to the resource
*
* @return void
*/
public function read_release() { $this->request_release(self::READ_ACCESS); }
/**
* Request write access to the resource
*
* @return void
*/
public function write_access() { $this->request_access(self::WRITE_ACCESS); }
/**
* Release write access to the resource
*
* @return void
*/
public function write_release() { $this->request_release(self::WRITE_ACCESS); }
}
共享內存+信號 實現原子性操作
$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R');
$shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$data = shm_attach($shmid, 1024);
// we now have our shm segment
// lets place a variable in there
shm_put_var ($data, $inmem, "test");
// now lets get it back. we could be in a forked process and still have
// access to this variable.
printf("shared contents: %s\n", shm_get_var($data, $inmem));
shm_detach($data);
以上列子來源php手冊 ?sem_get 函數comment
ucos實時操作系統學習筆記——任務間通信(信號量)
ucos實時操作系統的任務間通信有好多種,本人主要學習了sem, mutex, queue, messagebox這四種.系統內核代碼中,這幾種任務間通信機制的實現機制相似,接下來記錄一下本人對核心代 ...
Linux 信號量詳解一
信號量主要用于進程間(不是線程)的互斥,通過sem_p()函數加鎖使用資源,sem_v函數解鎖釋放資源,在加鎖期間,CPU從硬件級別關閉中斷,防止pv操作被打斷. semget函數 int semge ...
PHP進程通信基礎——信號量+共享內存通信
PHP進程通信基礎--信號量+共享內存通信 由于進程之間誰先執行并不確定,這取決于內核的進程調度算法,其中比較復雜.由此有可能多進程在相同的時間內同時訪問共享內存,從而造成不可預料的錯誤.信號量這個名 ...
C#多線程--信號量(Semaphore)
百度百科:Semaphore,是負責協調各個線程, 以保證它們能夠正確.合理的使用公共資源.也是操作系統中用于控制進程同步互斥的量. Semaphore常用的方法有兩個WaitOne()和Releas ...
Linux學習筆記(15)-信號量
在多線程或者多進程編程中,有一個非常需要關注的東西,那就是同步以及互斥問題. 同步是指多個進程之間的協作,而互斥是指多個進程之間,為了爭奪有限的資源,而進行的競爭. 理論很高端,但經過自己幾天的學習, ...
多線程之信號量(By C++)
信號量在多線程中,主要是用于線程的同步或者限制線程運行的數量. 所謂同步,當流程1運行在線程1中,流程2運行在線程2中,流程2必須在流程1結束之后才能開始執行.你會怎么做,所有就需要給出一個流程1結束 ...
信號量sem
一.什么是信號量 為了防止出現因多個程序同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成并使用令牌來授權,在任一時刻只能有一個執行線程訪問代碼的臨界區域.臨界區域是指執行數據更 ...
【.NET深呼吸】線程信號量(Semaphore)
Semaphore類可以控制某個資源允許訪問的線程數,Semaphore有命名式的,也有不命名的:如果不考慮跨進程工作,一般在代碼中使用不命名方式即可. 信號量有點類似于等待句柄,某個線程如果調用了W ...
java多線程--信號量Semaphore的使用
Semaphore可以控制某個共享資源可被同時訪問的次數,即可以維護當前訪問某一共享資源的線程個數,并提供了同步機制.例如控制某一個文件允許的并發訪問的數量. 例如網吧里有100臺機器,那么最多只能提 ...
java多線程-信號量
Semaphore(信號量)是一個線程同步結構,用于在線程間傳遞信號,以避免出現信號丟失,或者像鎖一樣用于保護一個關鍵區域.自從 5.0 開始,jdk 在 java.util.concurrent 包 ...
隨機推薦
使用Apache的Base64類實現Base64加解密
包名稱:org.apache.commons.codec.binary 類名稱:org.apache.commons.codec.binary.Base64 1.Base64加密 public sta ...
關于H5中自定義屬性的設置和獲取
自定義數據屬性是在HTML5中新加入的一個特性.簡單來說,自定義數據屬性規范規定任何以data-開頭屬性名并且賦值.自定義數據屬性是為了保存頁面或者應用程序的私有自定義數據,這些自定義數據屬性保存進D ...
JavaScript基礎---語言基礎(3)
流程控制語句 學習要點: 1.switch語句 2.for...in語句 3.break和continue語句 4.with語句 ECMA-262規定了一組流程控制語句.語句定義了ECMAScript ...
C++程序設計教程學習(0)-引子
回想一下從事C++相關開發工作已經有4年,主要從事基于MFC.Duilib等GUI框架開發進行windows應用程序開發,還涉及了一些開源的項目.但是真的談起這門語言或多或少都會有些心虛,關于C++的 ...
Word文件交換的電腦打開字體、排版變化的原因和解決方法!
方案: 有時候.我們好不easy用Word寫好文檔,做好排版發給別人,別人會告訴你格式怎么是亂的啊,標題.正文.頁眉頁腳什么的格式都變了. 想盡各種辦法都沒能得到解決,那么出現這樣的情況的原因究竟是什 ...
poj 3375 Network Connection
今天在叉姐的群里找點題目做,這題目還是很好的:提意思如下 [有M個可以提供計算機網絡的端口和N臺計算機(計算機數量少于端口數),每個端口和計算機有一個坐標(一維的)!其中端口與計算機鏈接的距離?|x? ...
ERROR: No pool defined. at least one pool section must be specified in config file
root@ubuntu:/opt/php7#?/opt/php7/sbin/php-fpm [22-Sep-2015?14:29:00]?WARNING:?Nothing?matches?the?in ...
mysql中的union用法以及子查詢綜合應用
union查詢就是把2條或者多條sql語句的查詢結果,合并成一個結果集. 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1.能否從2張表查詢再uni ...
Python爬蟲入門教程 5-100 27270圖片爬取
27270圖片----獲取待爬取頁面 今天繼續爬取一個網站,http://www.27270.com/ent/meinvtupian/ 這個網站具備反爬,so我們下載的代碼有些地方處理的也不是很到位, ...
Linux 下MQ的安裝和配置親測
開篇之前奉上幾條黃金鏈接: MQ參考文檔 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic=%2Fcom.ib ...
總結
以上是生活随笔為你收集整理的php 信号量 关闭,php 信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 继承与多态 习题_JAVA基础
- 下一篇: php long2ip,php 中IP