ilustrar
1. Semáforo: es una operación atómica proporcionada por el sistema. Una cantidad de señal solo puede ser operada por un proceso al mismo tiempo.
Un proceso recibe una señal y debe ser liberado por el proceso.
2. Memoria compartida: es un área de memoria pública abierta por el sistema en la memoria y a la que puede acceder cualquier proceso.
Al mismo tiempo, varios procesos pueden acceder a esta área. Para garantizar la coherencia de los datos, esta área de memoria debe estar bloqueada o señalizada.
Ejemplo
echo "pid de progreso principal:{$parentPid}n"; $listaniño = matriz(); //Crea memoria compartida, crea semáforo y define clave compartida $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $señal = sem_get($sem_id); constante SHARE_KEY = 1; // función de productor productor(){ global $compartirMemoria; señal $ global; $pid = posix_getpid(); $númerorepetición = 5; para ( $i = 1; $i <= $repeatNum; $i++) { //Adquirir el semáforo sem_acquire($signal); si (shm_has_var($shareMemory,SHARE_KEY)){ // Si hay un valor, agrega uno $count = shm_get_var($shareMemory,SHARE_KEY); $cuenta++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) recuento: {$cuenta}n"; }demás{ // Sin valor, inicialización shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) recuento: 0n"; } // Liberar después del uso sem_release($signal); $rand = rand(1,3); dormir ($ rand); } } función crearProgreso($devolución de llamada){ $pid = pcntl_fork(); si ($pid == -1) { // Error en la creación exit("¡error de progreso de la bifurcación!n"); } más si ($pid == 0) { // Programa de ejecución de subprocesos $pid = posix_getpid(); $devolución de llamada(); exit("({$pid})¡fin del progreso del niño!n"); }demás{ //El proceso padre ejecuta el programa return $pid; } } // 3 procesos de escritura para ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('productor'); $childList[$pid] = 1; echo "crear progreso hijo productor: {$pid} n"; } // Espera a que finalicen todos los procesos secundarios while(!empty($childList)){ $childPid = pcntl_wait($estado); si ($childPid > 0){ unset($childList[$childPid]); } } // Liberar memoria compartida y semáforo shm_remove($shareMemory); sem_remove($señal); echo "({$parentPid})¡fin del progreso principal!n";
Lo anterior es una introducción a los semáforos PHP y la memoria compartida. Espero que sea útil para todos.