PHPプロセス通信ベースの信号量と共有メモリ通信

2495 ワード

プロセス間で誰が先に実行するかは確定していないため、カーネルのプロセススケジューリングアルゴリズムに依存し、複雑です.これにより、マルチプロセスが同じ時間に共有メモリに同時にアクセスし、予期せぬエラーを引き起こす可能性があります.信号量という名前はわけがわからないが、英語の原意を見ると理解しやすい.
semaphore英[ˈseməfɔ:(r)]vt.は信号を出して、旗語を打つ.
指揮官の役割に似ている.
次に、次の擬似コード信号量の使用を見てみましょう.
1、信号量一意識別子の作成$ftok = ftok(__FILE__, 'a');
2、信号量リソースIDの作成$sem_resouce_id = sem_get($ftok);
3、受信信号量sem_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);
簡単なロックで、現在のトイレ(共有メモリ)が使用できるかどうかを知ることができます.この例は見栄えが悪いが,問題を説明した.このブログも味のあるブログで大変でした...サンプルコードは次のとおりです.

 0) {
  foreach ($child_list as $key => $pid) {
    $status = pcntl_waitpid($pid, $status);
    if ($status > 0 || $status == -1) {
      unset($child_list[$key]);
    }
  }
  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);