
ilustrar
1. Semáforo: É uma operação atômica fornecida pelo sistema. Uma quantidade de sinal só pode ser operada por um processo ao mesmo tempo.
Um processo recebe um sinal e deve ser liberado pelo processo.
2. Memória compartilhada: É uma área de memória pública aberta pelo sistema na memória e pode ser acessada por qualquer processo.
Ao mesmo tempo, vários processos podem acessar esta área. Para garantir a consistência dos dados, esta área de memória precisa ser bloqueada ou sinalizada.
Exemplo
echo "pid de progresso pai:{$parentPid}n";
$listafilho = array();
//Cria memória compartilhada, cria semáforo e define chave compartilhada
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,'s');
$shareMemory = shm_attach($shm_id);
$sinal = sem_get($sem_id);
const SHARE_KEY = 1;
//função produtora produtor(){
global $shareMemory;
sinal $ global;
$pid = posix_getpid();
$repetirNum = 5;
for ($i = 1; $i <= $repeatNum; $i++) {
//Adquira o semáforo sem_acquire($signal);
if (shm_has_var($shareMemory,SHARE_KEY)){
// Se houver um valor, adicione um $count = shm_get_var($shareMemory,SHARE_KEY);
$contar++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) contagem: {$count}n";
}outro{
// Sem valor, inicialização shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) contagem: 0n";
}
// Libera após uso sem_release($signal);
$rand = rand(1,3);
dormir($rand);
}
}
function createProgress($callback){
$pid = pcntl_fork();
se ($pid == -1) {
//Falha na criação exit("erro de progresso do fork!n");
} senão if ($pid == 0) {
// Programa de execução do subprocesso $pid = posix_getpid();
$retorno de chamada();
exit("({$pid})fim do progresso filho!n");
}outro{
//O processo pai executa o programa return $pid;
}
}
// 3 processos de escrita para ($i = 0; $i < 3; $i ++ ) {
$pid = createProgress('produtor');
$childList[$pid] = 1;
echo "criar progresso filho produtor: {$pid} n";
}
// Aguarde até que todos os processos filhos terminem while(!empty($childList)){
$childPid = pcntl_wait($status);
if ($filhoPid > 0){
unset($childList[$childPid]);
}
}
// Libera memória compartilhada e semáforo shm_remove($shareMemory);
sem_remove($sinal);
echo "({$parentPid})fim do progresso principal!n";O texto acima é uma introdução aos semáforos PHP e à memória compartilhada. Espero que seja útil para todos.