当前位置: 首页 > article >正文

信号量的使用和注意事项

大家好,今天给大家介绍信号量的使用和注意事项,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。
信号灯(信号量)集

POSIX 线程中的同步用的是无名信号量

进程间的同步使用的是IPC 对象[信号灯集]

信号灯集:信号灯集合,每一个信号灯都可以用来表示一类资源,其值表示资源的个数

(1)创建信号灯集

int semget(key_t key, int nsems, int semflg);

参数:

@key IPC_PRIVATE , ftok()

@nsems 信号灯集中信号灯的个数

@semflg IPC_CREAT | 0666,IPC_CREAT | IPC_EXCL

返回值:

成功返回ID,失败返回-1

(2)初始化信号灯集中信号灯的值

int semctl(int semid, int semnum, int cmd, ...);

参数:

@semid 信号灯集的ID

@semnum 信号灯的编号[编号从0开始]

@cmd SETVAL[设置信号灯的值] ,GETVAL(获取信号灯的值),IPC_RMID[删除信号灯集]

返回值:

成功返回0,失败返回-1

思考:将信号灯集中的1号信号灯初始化为1?

union semun {

int val; /* Value for SETVAL */

struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */

unsigned short *array; /* Array for GETALL, SETALL */

struct seminfo *__buf; /* Buffer for IPC_INFO

(Linux-specific) */

};

void init_sem_value(int sem_id,int sem_num,int value)

{

union semun sem_val;

sem_val.val = value;

if(semctl(sem_id,sem_num,SETVAL,sem_val) < 0)

{

...

}

return ;

}

(3)PV操作

int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:完成PV操作

参数:

@semid 信号灯集的ID

@sops 操作方式结构体首地址

@nsops 操作信号灯的个数

返回值:

成功返回0,失败返回-1

struct sembuf

{

unsigned short sem_num; /* semaphore number */

short sem_op; /* semaphore operation */

short sem_flg; /* operation flags */

};

sem_op :

<1>0 等待信号灯的值变成0

<2>1 释放资源,V操作

<3>-1 申请资源,P操作

sem_flg:

0 : 阻塞方式

IPC_NOWAIT : 非阻塞方式调用

SEM_UNDO : 进程结束的时候,它申请的资源自动释放

void P(int sem_id,int sem_num)

{

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op = -1;

sem.sem_flg = 0;

if(semop(sem_id,&sem,1) < 0)

{

....

}

}

void V(int sem_id,int sem_num)

{

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op = 1;

sem.sem_flg = 0;

if(semop(sem_id,&sem,1) < 0)

{

....

}

}

练习:A,B通过信号灯集同步对共享内存操作

让创建信号灯集的进程,初始化信号灯的值 ,如果信号灯集已经存在则不初始化

sem_id = semget(key,2,IPC_CREAT | IPC_EXCL | 0666);

if(sem_id < 0)//信号灯集已经,不初始化信号灯值

{

sem_id = semget(key,2,IPC_CREAT | 0666);

}else{

//初始化信号灯集中信号灯的值

}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理0元领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html


http://www.kler.cn/news/162919.html

相关文章:

  • 机器连接和工业边缘计算
  • 使用高防IP防护有哪些优势
  • 【华为OD题库-060】增强的strstr-java
  • 【ET8】3.ET8入门-一个简单示例
  • 计算机基础知识67--BBS
  • springboot 极简案例
  • 算法与数据结构--最短路径Dijkstra算法
  • c 把6*10 的char 数组扩充到8*12, 为图像帧分隔成8*8准备
  • uniapp开发小程序经验记录
  • 机器人纯阻抗控制接触刚性环境
  • 如何在Python中使用一行代码编写for循环
  • HarmonyOS应用开发工具DevEco Studio安装与使用
  • 【Vue】修改组件样式并动态添加样式
  • 初学vue3与ts:vue3选项式api获取当前路由地址
  • linux云服务器开启防火墙注意事件
  • 智能优化算法应用:基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 酿酒生产废水处理的设备需要哪些
  • 《论文阅读》用于情绪回复生成的情绪正则化条件变分自动编码器 Affective Computing 2021
  • 应用架构——集群、分布式、微服务的概念及异同
  • Spark大数据集群日常开发过程遇到的异常及解决思路汇总
  • RepVGG,结构重参数化让VGG风格的ConvNets再次强大起来
  • 人工干预与用户自主选择——算法安全背后的故事
  • Apache APISIX 体验指南
  • 与脾气不太好的领导,相处原则和相处技巧分享
  • Chrome 拓展开发系列:什么是 Chrome 拓展?
  • 常见客户端消息推送服务【Java后端】
  • wangEditor+vue上传图片到阿里云配置
  • 高性能队列框架-Disruptor使用、Netty结合Disruptor大幅提高数据处理性能
  • uniapp 使用 $emit和$on——$on中无法为data中的变量赋值
  • 大华DSS S2-045 OGNL表达式注入漏洞复现