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

信号量函数

头文件

#include <semaphore.h>

 

创建信号量

        对给定的信号量对象进行初始化。

函数原型

int sem_init(sem_t *sem, int pshared, unsigned int value);

sem:指向要初始化的信号量的指针

pshared:表示信号量的共享方式,0 表示在同一进程的多个线程间共享,非 0 表示在不同进程间共享
value:信号量的初始值 

sem_post函数 

        给信号量的值+1。

函数原型

int sem_post(sem_t *sem);

参数解释

        sem:初始化的信号量对象的指针作为参数,用来改变该对象的值

返回值

        成功:如果 sem_post 函数调用成功,它将返回 0,表示信号量的值已经成功增加,并且可能唤醒了正在等待该信号量的线程。

        失败:如果调用失败,函数将返回 -1,并设置 errno 变量来指示具体的错误原因。

sem_wait函数

        从信号量的值-1,但它永远会先等待该信号量为一个非零值才开始做减法

函数原型

int sem_wait(sem_t *sem);

参数解释

        sem:初始化的信号量对象的指针作为参数,用来改变该对象的值

返回值

        成功:返回0

sem_destroy函数

        用完信号量后,对该信号量进行清理。

        归还自己占有的一切资源,在清理信号量的时候如果还有线程在等待他,用户就会收到一个错误。

函数原型

int sem_destroy(sem_t *sem);

参数解释

        sem:初始化的信号量对象的指针作为参数,用来改变该对象的值

返回值

        调用成功:返回0

示例

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <semaphore.h>using namespace std;// 线程的安全问题:多线程访问共享数据,且对共享数据的操作为非原子性操作(不可能被中断的操作)int tickets = 10; // 总票数
sem_t sem; // 线程信号量void* thread_handle2(void* data) 
{char* name = (char*)data;while (true) {sem_wait(&sem);if (tickets > 0) {usleep(1);printf("%s已出票,剩余票数是:%d\n", name, --tickets);}else {printf("%s票已售罄\n", name);break;}sem_post(&sem);}
}int main() 
{pthread_t thread_id;int res = sem_init(&sem, 0, 1);char* s1 = "thread01";char* s2 = "thread02";char* s3 = "thread03";pthread_create(&thread_id, NULL, thread_handle2, s1);pthread_create(&thread_id, NULL, thread_handle2, s2);pthread_create(&thread_id, NULL, thread_handle2, s3);while (true) {}return 0;
}

结果

相关文章:

  • 计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)
  • Matlab 报错:尝试将 SCRIPT vl_sift 作为函数执行:
  • Linux 【杂谈】基础知识(一)
  • 双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图
  • 贪心算法-860.柠檬水找零-力扣(LeetCode)
  • Linux系统编程:信号量Semaphore详解 (IPC)
  • vue3中ref在js中为什么需要.value才能获取/修改值?
  • C++:STL——list
  • 可以隐藏列的表格
  • 单片机 + 图像处理芯片 + TFT彩屏 复选框控件
  • Linux内核中的编译时安全防护:以网络协议栈控制块校验为例
  • 单片机之间的双向通信
  • terraform查看资源建的关联关系
  • 一、linux系统启动过程操作记录
  • 插入排序(直接插入排序、折半插入排序和希尔排序)
  • C++中析构函数
  • log4cpp进阶指南
  • LeetCode 每日一题 2025/4/21-2025/4/27
  • 关于Spark知识点与代码测试的学习总结
  • element-ui dropdown 组件源码分享
  • 北京朝阳涉住宅组团地块126亿元成交
  • 广东雷州农商行董事长、原行长同日被查
  • 人社部:将会同更多部门分行业、分领域制定专项培训计划
  • 人民日报社论:做新时代挺膺担当的奋斗者
  • 巴达玛·利斯瓦达恭当选世界羽联主席,张军任理事会理事
  • 乌方称泽连斯基与特朗普进行简短会谈