中国建设银行演示网站新加坡建设局网站

bicheng/2026/1/17 11:59:06/文章来源:
中国建设银行演示网站,新加坡建设局网站,网站主机推荐,大学生活网站设计//转自http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来#xff0c;信号与信号量是不同的两种事物。有关信号的更多内容#xff0c;可以阅读我的另一篇文章#xff1a;L…//转自http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来信号与信号量是不同的两种事物。有关信号的更多内容可以阅读我的另一篇文章Linux进程间通信——使用信号。下面就进入信号量的讲解。 一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题我们需要一种方法它可以通过生成并使用令牌来授权在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制让一个临界区同一时间只有一个线程在访问它也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量程序对其访问都是原子操作且只允许对它进行等待即P(信号变量))和发送即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量这也是信号量最常见的一种形式叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。这里主要讨论二进制信号量。二、信号量的工作原理由于信号量只能进行两种操作等待和发送信号即P(sv)和V(sv),他们的行为是这样的P(sv)如果sv的值大于零就给它减1如果它的值为零就挂起该进程的执行V(sv)如果有其他进程因等待sv而被挂起就让它恢复运行如果没有进程因等待sv而挂起就给它加1.举个例子就是两个进程共享信号量sv一旦其中一个进程执行了P(sv)操作它将得到信号量并可以进入临界区使sv减1。而第二个进程将被阻止进入临界区因为当它试图执行P(sv)时sv为0它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量这时第二个进程就可以恢复执行。三、Linux的信号量机制Linux提供了一组精心设计的信号量接口来对信号进行操作它们不只是针对二进制信号量下面将会对这些函数进行介绍但请注意这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。1、semget函数它的作用是创建一个新信号量或取得一个已有信号量原型为[cpp] view plaincopyprint? int semget(key_t key, int num_sems, int sem_flags);   第一个参数key是整数值唯一非零不相关的进程可以通过它访问一个信号量它代表程序可能要使用的某个资源程序对所有信号量的访问都是间接的程序先通过调用semget函数并提供一个键再由系统生成一个相应的信号标识符semget函数的返回值只有semget函数才直接使用信号量键所有其他的信号量函数使用由semget函数返回的信号量标识符。如果多个程序使用相同的key值key将负责协调工作。第二个参数num_sems指定需要的信号量数目它的值几乎总是1。第三个参数sem_flags是一组标志当想要当信号量不存在时创建一个新的信号量可以和值IPC_CREAT做按位或操作。设置了IPC_CREAT标志后即使给出的键是一个已有信号量的键也不会产生错误。而IPC_CREAT | IPC_EXCL则可以创建一个新的唯一的信号量如果信号量已存在返回一个错误。semget函数成功返回一个相应信号标识符非零失败返回-1.2、semop函数它的作用是改变信号量的值原型为[cpp] view plaincopyprint? int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);   sem_id是由semget返回的信号量标识符sembuf结构的定义如下[cpp] view plaincopyprint? struct sembuf{      short sem_num;//除非使用一组信号量否则它为0      short sem_op;//信号量在一次操作中需要改变的数据通常是两个数一个是-1即P等待操作                      //一个是1即V发送信号操作。      short sem_flg;//通常为SEM_UNDO,使操作系统跟踪信号                      //并在进程没有释放该信号量而终止时操作系统释放信号量  };   3、semctl函数该函数用来直接控制信号量信息它的原型为[cpp] view plaincopyprint? int semctl(int sem_id, int sem_num, int command, ...);   如果有第四个参数它通常是一个union semum结构定义如下[cpp] view plaincopyprint? union semun{      int val;      struct semid_ds *buf;      unsigned short *arry;  };   前两个参数与前面一个函数中的一样command通常是下面两个值中的其中一个SETVAL用来把信号量初始化为一个已知的值。p 这个值通过union semun中的val成员设置其作用是在信号量第一次使用前对它进行设置。IPC_RMID用于删除一个已经无需继续使用的信号量标识符。四、进程使用信号量通信下面使用一个例子来说明进程间如何使用信号量来进行通信这个例子是两个相同的程序同时向屏幕输出数据我们可以看到如何使用信号量来使两个进程协调工作使同一时间只有一个进程可以向屏幕输出数据。注意如果程序是第一次被调用为了区分第一次调用程序时带一个要输出到屏幕中的字符作为一个参数则需要调用set_semvalue函数初始化信号并将message字符设置为传递给程序的参数的第一个字符同时第一个启动的进程还负责信号量的删除工作。如果不删除信号量它将继续在系统中存在即使程序已经退出它可能在你下次运行此程序时引发问题而且信号量是一种有限的资源。在main函数中调用semget来创建一个信号量该函数将返回一个信号量标识符保存于全局变量sem_id中然后以后的函数就使用这个标识符来访问信号量。源文件为seml.c代码如下[cpp] view plaincopyprint? #include unistd.h  #include sys/types.h  #include sys/stat.h  #include fcntl.h  #include stdlib.h  #include stdio.h  #include string.h  #include sys/sem.h    union semun  {      int val;      struct semid_ds *buf;      unsigned short *arry;  };    static int sem_id  0;    static int set_semvalue();  static void del_semvalue();  static int semaphore_p();  static int semaphore_v();    int main(int argc, char *argv[])  {      char message  X;      int i  0;        //创建信号量      sem_id  semget((key_t)1234, 1, 0666 | IPC_CREAT);        if(argc  1)      {          //程序第一次被调用初始化信号量          if(!set_semvalue())          {              fprintf(stderr, Failed to initialize semaphore\n);              exit(EXIT_FAILURE);          }          //设置要输出到屏幕中的信息即其参数的第一个字符          message  argv[1][0];          sleep(2);      }      for(i  0; i  10; i)      {          //进入临界区          if(!semaphore_p())              exit(EXIT_FAILURE);          //向屏幕中输出数据          printf(%c, message);          //清理缓冲区然后休眠随机时间          fflush(stdout);          sleep(rand() % 3);          //离开临界区前再一次向屏幕输出数据          printf(%c, message);          fflush(stdout);          //离开临界区休眠随机时间后继续循环          if(!semaphore_v())              exit(EXIT_FAILURE);          sleep(rand() % 2);      }        sleep(10);      printf(\n%d - finished\n, getpid());        if(argc  1)      {          //如果程序是第一次被调用则在退出前删除信号量          sleep(3);          del_semvalue();      }      exit(EXIT_SUCCESS);  }    static int set_semvalue()  {      //用于初始化信号量在使用信号量前必须这样做      union semun sem_union;        sem_union.val  1;      if(semctl(sem_id, 0, SETVAL, sem_union)  -1)          return 0;      return 1;  }    static void del_semvalue()  {      //删除信号量      union semun sem_union;        if(semctl(sem_id, 0, IPC_RMID, sem_union)  -1)          fprintf(stderr, Failed to delete semaphore\n);  }    static int semaphore_p()  {      //对信号量做减1操作即等待Psv      struct sembuf sem_b;      sem_b.sem_num  0;      sem_b.sem_op  -1;//P()      sem_b.sem_flg  SEM_UNDO;      if(semop(sem_id, sem_b, 1)  -1)      {          fprintf(stderr, semaphore_p failed\n);          return 0;      }      return 1;  }    static int semaphore_v()  {      //这是一个释放操作它使信号量变为可用即发送信号Vsv      struct sembuf sem_b;      sem_b.sem_num  0;      sem_b.sem_op  1;//V()      sem_b.sem_flg  SEM_UNDO;      if(semop(sem_id, sem_b, 1)  -1)      {          fprintf(stderr, semaphore_v failed\n);          return 0;      }      return 1;  }   运行结果如下注这个程序的临界区为main函数for循环不的semaphore_p和semaphore_v函数中间的代码。例子分析 同时运行一个程序的两个实例注意第一次运行时要加上一个字符作为参数例如本例中的字符‘O’它用于区分是否为第一次调用同时这个字符输出到屏幕中。因为每个程序都在其进入临界区后和离开临界区前打印一个字符所以每个字符都应该成对出现正如你看到的上图的输出那样。在main函数中循环中我们可以看到每次进程要访问stdout标准输出即要输出字符时每次都要检查信号量是否可用即stdout有没有正在被其他进程使用。所以当一个进程A在调用函数semaphore_p进入了临界区输出字符后调用sleep时另一个进程B可能想访问stdout但是信号量的P请求操作失败只能挂起自己的执行当进程A调用函数semaphore_v离开了临界区进程B马上被恢复执行。然后进程A和进程B就这样一直循环了10次。五、对比例子——进程间的资源竞争看了上面的例子你可能还不是很明白不过没关系下面我就以另一个例子来说明一下它实现的功能与前面的例子一样运行方式也一样都是两个相同的进程同时向stdout中输出字符只是没有使用信号量两个进程在互相竞争stdout。它的代码非常简单文件名为normalprint.c代码如下[cpp] view plaincopyprint? #include stdio.h  #include stdlib.h    int main(int argc, char *argv[])  {      char message  X;      int i  0;        if(argc  1)          message  argv[1][0];      for(i  0; i  10; i)      {          printf(%c, message);          fflush(stdout);          sleep(rand() % 3);          printf(%c, message);          fflush(stdout);          sleep(rand() % 2);      }      sleep(10);      printf(\n%d - finished\n, getpid());      exit(EXIT_SUCCESS);  }   运行结果如下例子分析从上面的输出结果我们可以看到字符‘X’和‘O’并不像前面的例子那样总是成对出现因为当第一个进程A输出了字符后调用sleep休眠时另一个进程B立即输出并休眠而进程A醒来时再继续执行输出同样的进程B也是如此。所以输出的字符就是不成对的出现。这两个进程在竞争stdout这一共同的资源。通过两个例子的对比我想信号量的意义和使用应该比较清楚了。六、信号量的总结信号量是一个特殊的变量程序对其访问都是原子操作且只允许对它进行等待即P(信号变量))和发送即V(信号变量))信息操作。我们通常通过信号来解决多个进程对同一资源的访问竞争的问题使在任一时刻只能有一个执行线程访问代码的临界区域也可以说它是协调进程间的对同一资源的访问权也就是用于同步进程的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建网站卖产品怎么样wordpress 广告 插件

1. final和override关键字 在C中,final 和 override 是两个用于类继承和成员函数重写的关键字,它们主要在面向对象编程的上下文中使用,以增强代码的可读性和安全性。 1. final 关键字 final 关键字主要有两种用法: 用于类&…

做电商需要知道的几个网站青岛有什么网络科技有限公司

提前声明&#xff1a;好久之前的文档&#xff0c;找不着出处&#xff0c;如有侵权&#xff0c;联系本人&#xff0c;马上处理&#xff01; 1) 贴图&#xff1a;<imgsrc"图片地址"> 2)加入连接&#xff1a;<a href"所要连接的相关地址">写上你…

wordpress+手机站云南手机网站建设

用FPGA CORDIC IP核实现信号的相位检测 1.matlab仿真 波形仿真代码&#xff1a; 代码功能&#xff1a;生成一个点频信号s&#xff0c;求出s的实部和虚部&#xff1b;并且结算相位角atan2。画出图形&#xff0c;并且将Q和I数据写入文件中。 %代码功能&#xff1a;生成一个点…

网站开发路径wordpress后台慢

目录 背景: 过程: 一.沟通与信息共享 三.问题解决与风向的管理 四:团队建设与文化建设 五持续改进和发展 总结&#xff1a; 背景: 在快节奏、高效率的现代工作环境中&#xff0c;每天的汇报会在工作环境中扮演着重要的沟通和写作的角色&#xff0c;汇报会作为一种非常重…

企业买好域名后怎么做网站无锡网站建设推荐智勇

批量查询圆通速递单号的物流信息&#xff0c;并对需要的单号进行颜色标记。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c…

哈尔滨行业网站建设策划wordpress安装大淘客

我认为要管理好前端团队&#xff1a; 本质上&#xff1a;让团队少走弯路&#xff0c;并引领团队走在正确的道路上。 理念上&#xff1a;让团队高效工作、快乐工作。 实施上&#xff1a;要想尽办法给团队、给成员赋能。 个人角度&#xff1a; 角色转变&#xff0c;开发人员 -&g…

阿里建站系统自己怎么做网站模块

不充钱&#xff0c;你怎么AC&#xff1f; 题目&#xff1a;http://codevs.cn/problem/3116/ 基础的高精度加法&#xff0c;注意一下两个数长短不一和答案第一位的处理即可&#xff0c;当然也可以用压位的方法做 1 #include<cstdio>2 #include<cstdlib>3 #include&l…

wordpress怎么搜索网站兼容模式网站错位

「面试专栏」前端面试之html篇⚡序言⭐一、题集内容抢先看&#x1f320;二、规范相关1、你如何理解HTML结构的语义化2、浏览器是怎么对 Html5 的离线储存资源进行管理和加载的呢3、HTML W3C的标准4、Doctype作用? 严格模式与混杂模式如何区分&#xff1f;它们有何意义?5、vie…

做网站与数据库的关系做网站 流量怎么抓钱

给定一个常数 K 以及一个单链表 L&#xff0c;请编写程序将 L 中每 K 个结点反转。例如&#xff1a;给定 L 为 1→2→3→4→5→6&#xff0c;K 为 3&#xff0c;则输出应该为 3→2→1→6→5→4&#xff1b;如果 K 为 4&#xff0c;则输出应该为 4→3→2→1→5→6&#xff0c;即…

企业开源建站系统我的网站百度怎么搜索不到了

2019独角兽企业重金招聘Python工程师标准>>> 随着发展&#xff0c;现代 Web 设计在改善体验和功能的同时&#xff0c;对于美观的追求也越来越高&#xff0c;可视化、交互式、动态等元素和效果似乎已成为标配。 以下是为开发者推荐的 10 款开源 Javascript 图表库&am…

福清市住房和城乡建设局网站佛山+网站建设

自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…

网站改版换域名手机网站创建站点成功

激活函数存在的意义&#xff1a; 激活函数决定了某个神经元是否被激活&#xff0c;当这个神经元接收到的信息是有用或无用的时候&#xff0c;激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数&#xff0c;神经元仅仅做线性变换&#xff0c;那么该神经网…

公司网站备案后在百度上多长时间可以搜索到济南做网站找大标

近日上海晋名又有两台室外危化品暂存柜项目通过验收&#xff0c;此次项目主要用于医药制造行业次氯酸钠、乙醇消毒剂、甲醛等化学品的室外暂存安全。 用户单位创立于2003年&#xff0c;是一家以从事医药制造业为主的企业。用户在日常工作运营中涉及到次氯酸钠、乙醇消毒剂、甲…

老河口城乡建设局网站市网站建设

目录 1. freemarker 介绍创建测试工程2.2.2) 配置文件2.2.3) 创建模型类2.2.4) 创建模板2.2.5) 创建controller2.2.6) 创建启动类2.2.7) 测试 2.3) freemarker基础2.3.1) 基础语法种类2.3.2) 集合指令&#xff08;List和Map&#xff09;2.3.3) if指令2.3.4) 运算符2.3.5) 空值处…

南昌网站改版陕西省住房和城乡建设厅

参考&#xff1a;如何自建根证书&#xff1f;使用openssl库自建根证书带图详解 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108217572?spm1001.2014.3001.5502 目录根证书的普通用途自建根证书步骤1、创建一个目录&#xff0c;存放所有证书有关资料2、进入…

静态网站html北京南站

3.1 Grand Central Dispatch (GCD)概要 3.1.1什么是GCD Grand Central Dispatch&#xff08;GCD&#xff09;是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中&#xff0c;GCD就能生成必要的…

网站开发的项目总结兰州做网站或小程序

目录 简介 CBAM注意力机制原理及代码实现 原理 代码实现 GAM注意力机制 原理 代码实现 修改损失函数 YAML文件 完整代码 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; http://t.csdnimg.c…

聊网站推广网站开发流程丽江

前提 Jenkins是容器化部署的&#xff0c;目前有后端Java的部署任务&#xff0c;完成打包生成jar包后&#xff0c;需要运行Dockerfile&#xff0c;打包生成镜像&#xff0c;进行了一些实践 参考文章 https://hackmamba.io/blog/2022/04/running-docker-in-a-jenkins-container…

网站名字 备案ccms系统

0x01 产品简介 ChatGPT-Next-Web 是一种基于 OpenAI 的 GPT-3.5 、GPT-4.0语言模型的产品。它是设计用于 Web 环境中的聊天机器人,旨在为用户提供自然语言交互和智能对话的能力。 0x02 漏洞概述 2024年3月,互联网上披露CVE-2023-49785 ChatGPT-Next-Web SSRF/XSS 漏洞,未经…

文案交流网站项目管理软件免费版

Pickcode 通过视觉课程、聊天机器人、游戏和绘图来教授编程。 Pickcode 是一种新的语言和编辑器&#xff0c;可以直观地指导用户编写代码来制作聊天机器人、动画图画和游戏。Pickcode 旨在让用户在学习更高级的语言之前能够充满信心地开始学习编码。 Pickcode 可视化编程语言…