
説明する
1. セマフォ: システムによって提供されるアトミック操作です。信号量は同時に 1 つのプロセスによってのみ操作できます。
プロセスはシグナルを受信し、プロセスによって解放される必要があります。
2. 共有メモリ: システムによってメモリ内に開かれる公開メモリ領域であり、どのプロセスからもアクセスできます。
同時に、複数のプロセスがこの領域にアクセスできます。データの一貫性を確保するには、このメモリ領域をロックするか、通知する必要があります。
例
echo "親の進行状況 pid:{$parentPid}n";
$childList = 配列();
//共有メモリの作成、セマフォの作成、共有キーの定義
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,'s');
$shareMemory = shm_attach($shm_id);
$signal = sem_get($sem_id);
const SHARE_KEY = 1;
// プロデューサー関数プロデューサー(){
グローバル $shareMemory;
グローバル $signal;
$pid = posix_getpid();
$repeatNum = 5;
for ( $i = 1; $i <= $repeatNum; $i++) {
//セマフォを取得 sem_acquire($signal);
if (shm_has_var($shareMemory,SHARE_KEY)){
// 値がある場合は 1 つ追加します $count = shm_get_var($shareMemory,SHARE_KEY);
$count++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) カウント: {$count}n";
}それ以外{
// 値なし、初期化 shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) カウント: 0n";
}
// 使用後に解放 sem_release($signal);
$rand = rand(1,3);
スリープ($rand);
}
}
関数 createProgress($callback){
$pid = pcntl_fork();
if ( $pid == -1) {
//作成に失敗しました exit("フォーク進行エラー!n");
else if ($pid == 0) {
// サブプロセス実行プログラム $pid = posix_getpid();
$callback();
exit("({$pid})子の進行状況は終了です!n");
}それ以外{
//親プロセスはプログラムを実行します return $pid;
}
}
// 3回の書き込み処理 for ($i = 0; $i < 3; $i ++ ) {
$pid = createProgress('プロデューサー');
$childList[$pid] = 1;
echo "プロデューサーの子の作成の進行状況: {$pid} n";
}
// すべての子プロセスが終了するまで待機します while(!empty($childList)){
$childPid = pcntl_wait($status);
if ($childPid > 0){
unset($childList[$childPid]);
}
}
// 共有メモリとセマフォを解放 shm_remove($shareMemory);
sem_remove($signal);
echo "({$parentPid})メインの進行状況は終了です!n";上記は PHP セマフォと共有メモリの概要です。皆様のお役に立てば幸いです。