php做网站页面在哪做苏州公司注册流程

张小明 2026/1/9 21:55:51
php做网站页面在哪做,苏州公司注册流程,上海专业做网站建设方法,北京网站建设上北京九五至尊网络1. 为什么要发明信号量#xff1f;这种多进程争抢访问的共享资源#xff08;如共享内存、打印机#xff09;#xff0c;被称为 临界资源 (Critical Resource)。访问这些资源的代码段#xff0c;叫 临界区 (Critical Section)。我们面临的问题是#xff1a;原子性 (Atomic…1. 为什么要发明信号量这种多进程争抢访问的共享资源如共享内存、打印机被称为临界资源 (Critical Resource)。访问这些资源的代码段叫临界区 (Critical Section)。我们面临的问题是原子性 (Atomicity)。你在 C 里写count汇编层面其实是 3 条指令读入寄存器、加1、写回内存。如果进程 A 执行了一半被切走了进程 B 来了数据就会乱套。信号量就是为了解决这个问题而生的。它本质上是一个内核中的计数器但它的增减操作是原子的要么全做完要么不做不会被打断。2. 核心原理PV 原语这是荷兰计算机科学家 Dijkstra迪杰斯特拉提出的概念是所有并发编程的基石。假设我们需要一把“锁”互斥量信号量的初始值设为1。P 操作 (Proberen, 测试/申请)逻辑sem--(计数器减 1)。判断如果减完后值 0申请资源成功进程继续执行拿到锁了。如果减完后值 0或者减之前是0资源没了进程挂起阻塞放入等待队列。V 操作 (Verhogen, 增加/释放)逻辑sem(计数器加 1)。动作如果加完后值 0说明等待队列里还有人唤醒一个等待的进程。进程继续执行。3. 复杂的 System V 接口Linux 的 System V 信号量设计得比较复杂它设计的初衷是让你可以一次操作一组信号量所以接口参数很多。我们要学会把复杂变简单。我们要用的三个核心函数A.semget—— 创建/获取int semget(key_t key, int nsems, int semflg);key和共享内存一样用ftok生成。nsems你要申请几个信号量通常我们只需要1个作为互斥锁。semflgIPC_CREAT | 0666等。B.semctl—— 控制/初始化int semctl(int semid, int semnum, int cmd, ...);semnum操作第几个信号量下标从 0 开始。cmdSETVAL设置信号量的初始值比如设为 1。IPC_RMID删除信号量集。C.semop—— 核心 PV 操作int semop(int semid, struct sembuf *sops, size_t nsops);这是最难用的函数我们需要定义一个结构体struct sembuf { unsigned short sem_num; // 操作第几个信号量 (0) short sem_op; // -1 是 P操作1 是 V操作 short sem_flg; // 通常设为 0或 SEM_UNDO };SEM_UNDO是个很重要的标志如果进程崩溃了没来得及释放锁操作系统会自动帮你“撤销”之前的 P 操作防止死锁。4.信号量实现进程通信代码common#pragma once #include iostream #include string #includecstring #include sys/types.h #include sys/ipc.h #include sys/types.h #include sys/stat.h #include sys/ipc.h #include sys/shm.h #includeunistd.h #includefcntl.h #includesys/sem.h // 生成key的路径和ID const std::string PATH_NAME .; const int PROJ_ID 6666; // 设置共享内存的大小 const int MEM_SIZE 4096; // 用于同步的命名管道 const std::string FIFO_NAME ./my_pipe; // 获取唯一的key key_t GetKey() { key_t key ftok(PATH_NAME.c_str(), PROJ_ID); if (key 0) { std::cout 创建共享key获取失败 std::endl; exit(1); } return key; } //信号量创建 int CreateSem(int nsems) { int keyGetKey(); int semsemget(key,nsems,IPC_CREAT|0666); if(sem0) { std::cout信号量创建失败std::endl; exit(1); } return sem; } //信号量获取 int GetSem() { int keyGetKey(); int semsemget(key,0,0); if(sem0) { std::cout信号量获取失败std::endl; exit(1); } return sem; } //信号量初始化 void InitSem(int semid, int which, int value) { union semun { int val; struct semid_ds *buf; unsigned short *array; }; union semun se; se.valvalue; semctl(semid,which,SETVAL,se); } //申请资源 void P(int semid, int which) { //int semop(int semid, struct sembuf *sops, size_t nsops); sembuf se; se.sem_numwhich; se.sem_op-1; se.sem_flg0; semop(semid,se,1); } //释放资源 void V(int semid, int which) { //int semop(int semid, struct sembuf *sops, size_t nsops); sembuf se; se.sem_numwhich; se.sem_op1; se.sem_flg0; semop(semid,se,1); } //信号量删除 void DleSem(int semid) { //int semop(int semid, struct sembuf *sops, size_t nsops); semctl(semid,0,IPC_RMID); }server.cc#include common.hpp // 创建共享内存读取数据 class Init { public: Init() { // 共享内存 key_t k GetKey(); std::cout server key: std::hex k std::dec std::endl; // 不存在就创建存在就报错 _shmid shmget(k, MEM_SIZE, IPC_CREAT | IPC_EXCL | 0666); if (_shmid 0) { perror(创建共享内存失败); exit(2); } std::cout 创建共享内存成功 _shmid std::endl; // 挂载 _start (char *)shmat(_shmid, nullptr, 0); if (_start (void *)(-1)) { perror(挂载失败); exit(3); } // 创建信号量 (申请1个) _semid CreateSem(1); if (_semid 0) { perror(信号量创建失败); exit(4); } // 3. 初始化信号量为 0 // 含义目前没有资源(数据)消费者必须等 InitSem(_semid, 0, 0); } ~Init() { // 去关联 shmdt(_start); // 删除共享内存 shmctl(_shmid, IPC_RMID, nullptr); // 删除信号量 DleSem(_semid); std::cout 资源清理完毕.... std::endl; } public: int _shmid; int _semid; char *_start; }; int main() { Init init; std::cout server ready.... std::endl; while (true) { P(init._semid, 0); // 收到信号 std::cout 客户端说 init._start std::endl; if (strcmp(init._start, quit) 0) { break; } } return 0; }client.cc#includecommon.hpp int main() { //获取key key_t kGetKey(); //获取共享内存ID int shmidshmget(k,MEM_SIZE,IPC_CREAT); if(shmid0) { perror(共享内存获取失败); return 1; } //挂接 char* start(char*)shmat(shmid,nullptr,0); if(start(char*)(-1)) { perror(共享内存挂接失败); return 2; } int semid GetSem(); //开始写入数据 while(true) { std::cout; std::string buffer; std::getline(std::cin,buffer); //直接把数据写到共享内存 snprintf(start,MEM_SIZE,%s,buffer.c_str()); //通知server V(semid,0); if(bufferquit) { break; } } //去关联但是不需要删除共享内存 shmdt(start); return 0; }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

国内餐饮类网站欣赏最新室内装修效果图大全

在日常工作中,你是不是经常需要绘制流程图,但又觉得手写Mermaid代码太麻烦?或者对Mermaid语法不熟悉,不知道如何开始?其实,现在有了AI的帮助,这一切都变得简单了。你只需要用文字描述你的流程&a…

张小明 2026/1/7 18:31:28 网站建设

网站建设怎么做?在电商网站上做推广的技巧

5分钟搞定Jellyfin电子书库:书架插件完整使用指南 【免费下载链接】jellyfin-plugin-bookshelf 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-bookshelf 还在为海量电子书无处安放而烦恼吗?Jellyfin书架插件正是你需要的解决方…

张小明 2026/1/7 18:30:55 网站建设

山东省建设执业官方网站wordpress中is

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个基于COMFYUI的AI辅助工作流设计工具,要求:1. 实现可视化节点拖拽界面 2. 集成AI自动连接建议功能 3. 包含参数智能优化模块 4. 支持实时错误检测 5…

张小明 2026/1/7 18:30:24 网站建设

网站图片大小深圳办公室装修装修公司

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请生成一个谷歌学术镜像网站的完整项目代码,要求:1.前端使用Vue3Element Plus实现响应式布局 2.后端使用Node.jsExpress处理请求 3.集成谷歌学术搜索API 4.…

张小明 2026/1/9 6:53:23 网站建设

厦门有什么网站制作公司免费制作动态图片软件

摘要 随着高等教育普及和就业市场竞争加剧,高校实习信息管理成为提升学生就业竞争力的重要环节。传统实习信息发布方式依赖人工操作,存在信息分散、更新滞后、管理效率低下等问题。为解决这些问题,设计并实现一个高效、便捷的高校实习信息发…

张小明 2026/1/7 18:29:19 网站建设

建设部网站注销一级建造师幻灯片插件wordpress

AI Toolkit模型卡片:从性能可视化到智能决策的完整指南 【免费下载链接】vscode-ai-toolkit 项目地址: https://gitcode.com/GitHub_Trending/vs/vscode-ai-toolkit 你是否曾在众多AI模型面前感到选择困难?面对眼花缭乱的模型参数和版本更新&…

张小明 2026/1/7 18:28:45 网站建设