| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 【进程同步】使用信号量实现进程同步(附C++实现代码) -> 正文阅读 |
|
[C++知识库]【进程同步】使用信号量实现进程同步(附C++实现代码) |
进程同步进程同时处理同一串数据, 会造成不确定性,比如有多个进程同时对一个文件进行读写,那么读文件的进程无法确定自己读到的数据是否是它本来想要的数据,还是被修改的数据,除此以外,当先读后写时,由于缓冲区没有写入数据,读进程无数据可读,就会因此被阻塞(使用管道通信)。 这种两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精准时序,称为数据竞争,而这种多个程序可以并发执行,但是由于系统资源有限,程序的执行不是一贯到底的,以不可预知的速度向前推进,这又被称为异步性。 这种受访问顺序影响的数据是没有意义的(程序的运行不能有二义性),所以为了能够使得进程有能够有一定的顺序来访问数据,从而引入了同步的概念。
本文将主要讲解如何使用信号量实现进程同步。 信号量基本概念信号量相当于一个信号灯,在程序实现中往往是一个非负整数。在实际生活中,如火车进站前会看到的信号灯,若灯亮说明火车可以进站,否则不能进站,这里的信号灯就可以看作是信号量,火车看作是进程,能否进站即能否访问资源。 在进程进入一个关键代码段之前,进程必须获取一个信号量;一旦该关键代码段执行完毕了,那么该线程必须释放信号量。其它想进入该关键代码段的进程必须等待直到第一个进程释放信号量。
PV操作PV操作即是针对信号量进行的相应操作,PV操作由P操作原语和V操作原语组成(原语是不可中断的过程)。 当进程执行P操作,若信号量大于零(有共享资源),则信号量减一,进程继续执行;若信号量为零,则进程等待。 关于信号量的函数使用信号量的相关函数时需要添加头文件 接下来我们具体学习关于信号量的相关函数,根据信号量是否命名分为命名信号量(基于文件实现)和匿名信号量(基于内存)。 命名信号量相关函数
匿名信号量相关函数
信号量的使用命名信号量我们首先创建两个进程,具体代码如下:
执行结果如下:
执行结果如下: 需要注意的是,在代码备注中我们也提到了,创建的文件将会默认在 匿名信号量以上我们使用了一个命名的信号量来实现了进程同步,除此以外,我们也可以使用匿名的信号量来实现同步。 我们知道fork所生成的父子进程的内存资源是共享的,故而我们可以借助这个特点,来创建一个父子进程都可以访问到的内存来初始化信号量,这里我们就需要借助匿名的共享内存来实现这个操作。(如果需要了解共享内存相关知识,可以查看:【进程间通信2】使用共享内存实现进程间的通信(附C++实现代码)) 故而,匿名信号量是基于共享内存来实现的,它不涉及需要指定某个特定文件,故而创建这种匿名信号量不会生成/dev/shm下的文件。 我们给出具体代码如下:
执行结果如下: 多值信号量在实际生活中的资源往往不只一个,在这部分我们针对停车场这个应用场景,在停车场没有车位的情况下,车无法进入停车场停车,如有车位则正常停车。具体代码如下:
注意这里只需要创建,所以sem_open函数中的标志位为
需注意该文件运行的命令格式为
然后我们就可以运行代码如下: |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 5:39:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |