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

linux的信号量的使用

1.信号量

在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。

这个sem_wait(&sem)后面的就是房子,每当等到别人给了我钥匙(就是等到了sem_post),这个时候就可以进入房子,每进入一次当前的钥匙就没了,下次进入还得等钥匙!

简单解释一下:

2. sem_init(&sem, 0, 0);

这个是创建一把钥匙,钥匙名字为了sem。

  1. 0:表示这个信号量是在进程间共享的,如果是非0值,则表示信号量只在当前进程中有效。
  2. 0:表示信号量的初始值。

3.sem_wait(&sem)

这个函数会一直阻塞在那,直到别人释放钥匙(信号量),才能让代码往下执行。

4.sem_post(&sem);

这个就是把钥匙给一个别人

以下是一个代码demo

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <string.h>
#include<unistd.h>
sem_t sem;void* change_resource(void* resource) {char* msg = (char*)resource;while(1){sem_wait(&sem);strcat(msg, "a");printf("resource changed with value: %s\n", msg);}return NULL;
}int main() {int ret;pthread_t thread;char msg[100] = "Initial ";ret = sem_init(&sem, 0, 0);if (ret != 0) {perror("sem_init");return 1;}ret = pthread_create(&thread, NULL, change_resource, (void*)msg);if (ret != 0) {perror("pthread_create");return 1;}while (1) {sem_post(&sem);printf("Semaphore send sem\n");sleep(1);}return 0;
}

以下是程序运行的结果

http://www.lryc.cn/news/347773.html

相关文章:

  • C--贪吃蛇
  • element ui的确认提示框按钮样式修改
  • 【vue】keep-alive:true缓存导致页面数据不刷新
  • Golang — map的使用心得和底层原理
  • Oracle如何收缩减小表空间大小
  • 【爬虫】爬取股票历史K线数据写入数据库(三)
  • 文心一言指令
  • 常用的命令技巧总结
  • T97燃脂咖啡招商模式,私域分销模式设计
  • 触摸OpenNJet,感悟云原生
  • UE4 自定义shader获取灯光位置
  • 机器学习(五) ----------决策树算法
  • Redis的数据完全是存在内存中的吗?
  • Linux开发--Linux设备驱动核心
  • vue3引入vant完整步骤
  • C语言——文件缓冲区
  • 如何快速检测原理图中的元器件与PLM系统的一致性,提高原理图设计准确性
  • 英特尔处理器排行
  • 【日志革新】在ThinkPHP5中实现高效TraceId集成,打造可靠的日志追踪系统
  • 英译汉早操练-(二十)
  • Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)
  • (五)STM32F407 cubemx IIC驱动OLED(1)IIC协议篇
  • OpenCV特征匹配总结
  • 二叉树的四种遍历代码实现
  • 系统和功能测试:确保软件的功能和易用性
  • 关于服务端接口知识的汇总
  • 树(数据结构)
  • Spring底层入门(十一)
  • 优质资料:大型制造企业等级保护安全建设整改依据,系统现状分析,网络安全风险分析
  • 几种监控工具学习