PHP程序通訊基礎之訊號量與共享記憶體通訊

2022-09-29 23:18:19 字數 1747 閱讀 9471

由於程序之間誰先執行並不確定,這取決於核心的程序排程演算法,其中比較複雜。由此有可能多程序在相同的時間內同時訪問共享記憶體,從而造成不可預料的錯誤。訊號量這個名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。

semaphore 英[ˈseməfɔ:(r)] vt. 發出訊號,打旗語;

類似於指揮官的作用。

下面我們看下乙個偽**訊號量的使用。

1、建立訊號量唯一識別符號

$ftok =zjuwjssj ftok(__file__, 'a');

2、建立訊號量資源id

$sem_resouce_id = sem_get($ftok);

3、接受訊號量

swww.cppcns.comem_acqure($sem_resource_id);

4、釋放訊號量

sem_release($sem_resource_id);

5、銷毀信程式設計客棧號量

sem_remove($sem_resource_id);

舉個不文雅的例子,使我們容易理解這個訊號量在生活中的用法。理解之後可以套用到我們程式設計領域。

一家公司只有乙個衛生間。那麼當有人上廁所的時候,都要獲取一把鎖(訊號量),表示衛生間正在使用。**如下:

sem_acqure($sem_resource_id);

那麼員工上完廁所之後,就需要將鎖開啟,釋放鎖(訊號量),表示現在可以允許別人使用。**如下:

sem_release($sem_resource_id);

通過乙個簡單的鎖,我們就能夠知道當前的廁所(共享記憶體)是否可以使用。這個例子**觀,但說明了問題。這篇部落格也是有味道的部落格,真是不容易。。。。以下是示例**:

php//建立共享記憶體區域

$shm_key = ftok(__file__, 'a');

$shm_id = shm_attach($shm_key, 1024, 0755);

//var_dump($shm_id);die(); resource(4) of type (sysvshm)

const share_key = 1;

$child_list = ;

//加入訊號量

$sem_id = ftok(__file__, 'b');

$signal = sem_get($sem_id);

//$signal resource(5) of type (sysvsem)

for ($i = 0; $i < 3; $i++) elseif ($pid == 0) else

echo "child process: ".getmypid()." is writing! now count is: $count ".php_eol;

//釋放訊號量

sem_release($signal);

exit("child process".getmypid()."end".php_eol);

} else

}while (count($child_list) > 0)

} sleep(1);

}$count = shm_get_var($shm_id, share_key);

echo " $count ".php_eol;

//銷毀訊號量

sem_remove($signal);

shm_remove($shm_id);

shm_detach($shm_id);

本文標題: php程序通訊基礎之訊號量與共享記憶體通訊

本文位址:

程序通訊之訊號量

1 訊號和訊號量 訊號與訊號量是不同的兩種事物。訊號量是用來調協程序對共享資源的訪問的。為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問 題,通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行,而訊號量就可以提供這樣的一種...

程序通訊之訊號量

一 訊號量 訊號燈 概念 訊號量提供一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問他,也就是說訊號量用來協調程序對共享資源的訪問的。訊號量是乙個特殊的變數,程式對其訪問都是原子操作,只允許對他進行等待 p 和傳送資訊 v 的操作。最簡單的訊號量只能取0和1的變數,這也是訊號量最常見的一種形式,...

程序通訊之訊號量

程序通訊之訊號量 一 引言 我們知道在一條單軌鐵路上,任何時候在上面只能有一列列車行駛在上面。而管理這條鐵路的系統就是訊號量,任何一列列車必須等到表明可以行駛的訊號確認以後才能進入鐵路。當一列列車進入軌道行駛時,需要將軌道改為禁止其他列車進入,從而防止不知情的列車進入軌道,發生衝突。而當列車行駛完這...