加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何理解PHP信号量和共享内存的定义和示例

发布时间:2023-05-17 13:50:16 所属栏目:PHP教程 来源:
导读:跟大家聊聊有关“如何理解PHP信号量和共享内存的定义和实例”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“如何理解PHP信号量和共享内存的定
跟大家聊聊有关“如何理解PHP信号量和共享内存的定义和实例”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“如何理解PHP信号量和共享内存的定义和实例”文章能对大家有帮助。
 
说明
 
1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作。
 
一个过程获得一个信号,必须被过程释放。
 
2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问。
 
在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号。
 
实例
 
echo "parent progress pid:{$parentPid}\n";
 
$childList = array();

// 创建共享内存,创建信号量,定义共享key
 
$shm_id = ftok(__FILE__,'m');
 
$sem_id = ftok(__FILE__,'s');
 
$shareMemory = shm_attach($shm_id);
 
$signal = sem_get($sem_id);
 
const SHARE_KEY = 1;
 
// 生产者
 
function producer(){
 
    global $shareMemory;
 
    global $signal;
 
    $pid = posix_getpid();
 
    $repeatNum = 5;
 
    for ( $i = 1; $i <= $repeatNum; $i++) {
 
        // 获得信号量
 
        sem_acquire($signal);

        if (shm_has_var($shareMemory,SHARE_KEY)){
 
            // 有值,加一
 
            $count = shm_get_var($shareMemory,SHARE_KEY);
 
            $count ++;
 
            shm_put_var($shareMemory,SHARE_KEY,$count);
 
            echo "({$pid}) count: {$count}\n";
 
        }else{
 
            // 无值,初始化
 
            shm_put_var($shareMemory,SHARE_KEY,0);
 
            echo "({$pid}) count: 0\n";
 
        }
 
        // 用完释放
 
        sem_release($signal);
 
        $rand = rand(1,3);
 
        sleep($rand);
 
    }
 
}
 
function createProgress($callback){
 
    $pid = pcntl_fork();
 
    if ( $pid == -1) {
 
        // 创建失败
 
        exit("fork progress error!\n");
 
    } else if ($pid == 0) {
 
        // 子进程执行程序
 
        $pid = posix_getpid();
 
        $callback();
 
        exit("({$pid})child progress end!\n");
 
    }else{
 
        // 父进程执行程序
 
        return $pid;
 
    }
 
}
 
// 3个写进程
 
for ($i = 0; $i < 3; $i ++ ) {
 
    $pid = createProgress('producer');
 
    $childList[$pid] = 1;
 
    echo "create producer child progress: {$pid} \n";
 
}
 
// 等待所有子进程结束
 
while(!empty($childList)){
 
    $childPid = pcntl_wait($status);
 
    if ($childPid > 0){
 
        unset($childList[$childPid]);
 
    }
 
}
 
// 释放共享内存与信号量
 
shm_remove($shareMemory);
 
sem_remove($signal);
 
echo "({$parentPid})main progress end!\n";
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!