
說明
1.信號量:是系統提供的一種原子操作,一個訊號數量,同時只有一個進程能操作。
一個過程獲得一個訊號,必須被過程釋放。
2.共享記憶體:是系統在記憶體中開啟的一個公共記憶體區域,任何一個過程都可以存取。
在同一時刻,可以有多個流程存取該區域,為了確保資料的一致性,需要對該記憶體區域進行鎖定或訊號。
實例
echo "parent progress pid:{$parentPid}n";
$childList = array();
// 建立共享記憶體,建立信號量,定義共享key
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,'s');
$shareMemory = shm_attach($shm_id);
$signal = sem_get($sem_id);
const SHARE_KEY = 1;
// 生產者function producer(){
global $shareMemory;
global $signal;
$pid = posix_getpid();
$repeatNum = 5;
for ( $i = 1; $i <= $repeatNum; $i++) {
// 得到信號量 sem_acquire($signal);
if (shm_has_var($shareMemory,SHARE_KEY)){
// 有值,加一 $count = shm_get_var($shareMemory,SHARE_KEY);
$count ++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) count: {$count}n";
}else{
// 無值,初始化 shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) count: 0n";
}
// 用完釋放 sem_release($signal);
$rand = rand(1,3);
sleep($rand);
}
}
function createProgress($callback){
$pid = pcntl_fork();
if ( $pid == -1) {
// 建立失敗 exit("fork progress error!n");
} else if ($pid == 0) {
// 子程序執行程式 $pid = posix_getpid();
$callback();
exit("({$pid})child progress end!n");
}else{
// 父行程執行程式 return $pid;
}
}
// 3個寫行程for ($i = 0; $i < 3; $i ++ ) {
$pid = createProgress('producer');
$childList[$pid] = 1;
echo "create producer child progress: {$pid} n";
}
// 等待所有子程序結束while(!empty($childList)){
$childPid = pcntl_wait($status);
if ($childPid > 0){
unset($childList[$childPid]);
}
}
// 釋放共享記憶體與信號量shm_remove($shareMemory);
sem_remove($signal);
echo "({$parentPid})main progress end!n";以上就是php信號量和共享記憶體的介紹,希望對大家有幫助。