Linux 应用程序信号量使用实战

news/2024/11/23 9:30:32/

背景

在项目实施过程中,有个机制需要做两个线程之间的同步。

具体需求如下:

首先,线程1需要把资源读取到缓存

其次,线程2才可以操作这块缓存

上述两个动作顺序交替重复。

思路

使用信号量解决思路,申请两个信号量,具体流程如下所述:

申请两个信号量,其中信号量1初始化为无信号,信号量2初始化为有信号

线程1首先申请信号量2的信号,有信号后,线程1把资源读取到缓存后,才释放信号量1

线程2首先申请信号量1的信号,有信号后,线程2操作完这块缓存后,才释放信号量2

代码

具体代码如下:

头文件

#include <semaphore.h>

定义全局信号量

sem_t sem1;
sem_t sem2;

初始化信号量,这里信号量2申请为有信号状态

    ret = sem_init(&sem1, 0, 0);if (ret == -1) {printf("sem1_init failed \n");return -1;}ret = sem_init(&sem2, 0, 1);if (ret == -1) {printf("sem2_init failed \n");return -1;}

线程1首先申请信号量2的信号,有信号后,线程1把资源读取到缓存后,才释放信号量1

void* thread1(void *res)
{while (1) {sem_wait(&sem2);//开始写入保护的内存数据xxxxxxxxxx//结束写入保护的内存数据sem_post(&sem1);}
}

线程2首先申请信号量1的信号,有信号后,线程2操作完这块缓存后,才释放信号量2

void* thread2(void *res)
{while (1) {sem_wait(&sem1);//开始读出保护的内存数据xxxxxxxxxx//结束读出保护的内存数据sem_post(&sem2);}
}

上述基本上表述了,针对内存的保护,不知道说清楚了没有。表述应该还算明白

线程申请信号,不能一直等待,需要超时处理,我这超时设置时毫秒级别,时间比较长

具体代码如下,设置500ms超时等待

struct timespec ts;clock_gettime(CLOCK_REALTIME, &ts);ts.tv_nsec += 500*1000*1000;sem_timedwait(&sem,&ts);

信号量的一些基本概念

信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

(1)P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

(2)V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)

注:原子操作:单指令的操作称为原子的,单条指令的执行是不会被打断的


http://www.ppmy.cn/news/297635.html

相关文章

Directx 10 is not supported方法一

在安装印制板软件时&#xff0c;出现“Directx 10 is not supported”的提示或PCB操作区无显示情况&#xff0c;解决方法是更新显卡驱动&#xff08;我的电脑-设备管理器-显示卡&#xff09;或安装显卡驱动&#xff08;根据显卡厂家去官网下载对应驱动&#xff09;&#xff0c;…

Goby 漏洞更新 |Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞(CVE-2022-39267)

漏洞名称&#xff1a;Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞&#xff08;CVE-2022-39267) English Name&#xff1a;Bifrost X-Requested-With Authentication Bypass Vulnerability (CVE-2022-39267) CVSS core: 8.8 影响资产数&#xff1a;14 漏洞描述&a…

《C++高级编程》读书笔记(七:内存管理)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 使用动态内存 1.1 如何描绘内存 在本书中&#xff0c;内存单…

【Linux系统进阶详解】Linux数字权限rwx-,4210,8进制权限表示法与字符权限区别及实战精讲

在Linux系统中,文件和目录的权限可以使用数字权限和字符权限两种表示方法。数字权限使用四个数字来表示文件和目录的权限,而字符权限则使用r、w和x等字符来表示文件和目录的权限。下面我们将分别介绍数字权限和字符权限,并提供一些实战精讲和使用案例。 数字权限 数字权限…

设置tablayout选中文字颜色和背景图片

很想爆粗口&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;妈的&#xff0c;我的tablayout为什么在布局文件下面写的时候就是不好用的&#xff0c;改变什么都是不好用的&#xff01;&#xff01;&#xff01;没办法只能用代码的方式来粗暴的解决问题了。。。。一…

css基础02--选择器、标签显示模式、背景及三大特性

内容摘要&#xff1a; 1.css选择器分基础选择器和复合选择器。css复合选择器有后代选择器、子元素选择器、交集选择器和并集选择器。 2.标签显示模式有三种&#xff1a;块级元素、行内元素、行内块元素。 3.css背景设置包含&#xff1a;背景颜色&#xff08;color&#xff09;、…

CSS背景特殊属性值

CSS代码示例-背景附着属性(background-attachment)-[背景图固定不动&#xff0c;不跟随滚动条滚动]&#xff1a;<html><head><title>背景附着属性 background-attachment</title><style type"text/css">body {background-image:url(..…

CSS-06-2 标签显示模式 行高 背景颜色 css三大特性

2. 标签显示模式&#xff08;display&#xff09;重点 目标&#xff1a; 理解 标签的三种显示模式三种显示模式的特点以及区别理解三种显示模式的相互转化 应用 实现三种显示模式的相互转化 2.1 什么是标签显示模式 什么是标签的显示模式&#xff1f; 标签以什么方式进行显…