
иллюстрировать
1. Семафор: это атомарная операция, предоставляемая системой. Количество сигналов может обрабатываться только одним процессом одновременно.
Процесс получает сигнал и должен быть освобожден им.
2. Общая память. Это область общедоступной памяти, открытая системой в памяти, к которой может получить доступ любой процесс.
В то же время несколько процессов могут получить доступ к этой области. Чтобы обеспечить согласованность данных, эта область памяти должна быть заблокирована или сигнализирована.
Пример
echo "Родительский идентификатор прогресса: {$parentPid}n";
$childList = массив();
//Создаем общую память, создаем семафор и определяем общий ключ
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,');
$shareMemory = shm_attach($shm_id);
$сигнал = sem_get($sem_id);
константный SHARE_KEY = 1;
// функция производителя Producer(){
глобальный $shareMemory;
глобальный $сигнал;
$pid = posix_getpid();
$repeatNum = 5;
for ($i = 1; $i <= $repeatNum; $i++) {
//Получаем семафор sem_acquire($signal);
если (shm_has_var($shareMemory,SHARE_KEY)){
// Если значение есть, добавьте его $count = shm_get_var($shareMemory,SHARE_KEY);
$счет++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) count: {$count}n";
}еще{
// Нет значения, инициализация shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) count: 0n";
}
// Освобождение после использования sem_release($signal);
$ранд = рандом(1,3);
сон($ранд);
}
}
функция createProgress($callback){
$pid = pcntl_fork();
если ($pid == -1) {
//Ошибка создания exit("Ошибка выполнения форка!n");
} иначе если ($pid == 0) {
// Программа выполнения подпроцесса $pid = posix_getpid();
$ обратный вызов();
exit("({$pid})дочерний прогресс завершен!n");
}еще{
//Родительский процесс выполняет программу return $pid;
}
}
// 3 процесса записи для ($i = 0; $i < 3; $i++) {
$pid = createProgress('продюсер');
$childList[$pid] = 1;
echo "создать дочерний прогресс производителя: {$pid} n";
}
// Ждем завершения всех дочерних процессов while(!empty($childList)){
$childPid = pcntl_wait($status);
если ($childPid > 0){
unset($childList[$childPid]);
}
}
// Освобождаем разделяемую память и семафор shm_remove($shareMemory);
sem_remove ($ сигнал);
echo "({$parentPid})конец основного прогресса!n";Вышеуказанное представляет собой введение в семафоры PHP и разделяемую память. Надеюсь, это будет полезно всем.