説明する
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 セマフォと共有メモリの概要です。皆様のお役に立てば幸いです。