veranschaulichen
1. Semaphor: Es handelt sich um eine atomare Operation, die vom System bereitgestellt wird. Eine Signalmenge kann nur von einem Prozess gleichzeitig betrieben werden.
Ein Prozess erhält ein Signal und muss vom Prozess freigegeben werden.
2. Gemeinsam genutzter Speicher: Es handelt sich um einen öffentlichen Speicherbereich, der vom System im Speicher geöffnet wird und auf den jeder Prozess zugreifen kann.
Gleichzeitig können mehrere Prozesse auf diesen Bereich zugreifen. Um die Datenkonsistenz sicherzustellen, muss dieser Speicherbereich gesperrt oder signalisiert werden.
Beispiel
echo "parent progress pid:{$parentPid}n"; $childList = array(); //Gemeinsamen Speicher erstellen, Semaphor erstellen und gemeinsam genutzten Schlüssel definieren $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $signal = sem_get($sem_id); const SHARE_KEY = 1; // Produzentenfunktion Producer(){ global $shareMemory; globales $signal; $pid = posix_getpid(); $repeatNum = 5; for ( $i = 1; $i <= $repeatNum; $i++) { //Semaphor erwerben sem_acquire($signal); if (shm_has_var($shareMemory,SHARE_KEY)){ // Wenn ein Wert vorhanden ist, fügen Sie einen hinzu $count = shm_get_var($shareMemory,SHARE_KEY); $count++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) count: {$count}n"; }anders{ // Kein Wert, Initialisierung shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) count: 0n"; } // Nach Gebrauch freigeben sem_release($signal); $rand = rand(1,3); schlafen($rand); } } Funktion createProgress($callback){ $pid = pcntl_fork(); if ( $pid == -1) { //Erstellung fehlgeschlagen exit("Fork-Fortschrittsfehler!n"); } else if ($pid == 0) { // Unterprozess-Ausführungsprogramm $pid = posix_getpid(); $callback(); exit("({$pid})child progress end!n"); }anders{ //Der übergeordnete Prozess führt das Programm aus return $pid; } } // 3 Schreibvorgänge für ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('producer'); $childList[$pid] = 1; echo "Producer-Child-Fortschritt erstellen: {$pid} n"; } // Warten, bis alle untergeordneten Prozesse beendet sind while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } // Gemeinsamen Speicher und Semaphor freigeben shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid})main progress end!n";
Das Obige ist eine Einführung in PHP-Semaphoren und Shared Memory. Ich hoffe, es wird für alle hilfreich sein.