信号量sem_init,sem_wait,sem_post

2023-05-16

本篇文章是信号量的简单入门,主要学习关于信号量四个函数的使用。 
文章综合整理了两篇文章: 
http://blog.csdn.net/qyz_og/article/details/47189219 
http://blog.csdn.net/ljianhui/article/details/10813469/ 
在此一并感谢~

一、什么是信号量
线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。

而只有0和1两种取值的信号量叫做二进制信号量,在这里将重点介绍。而信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。我们可以使用二进制信号量来完成这个工作。

二、信号量的接口函数
信号量的函数都以sem_开头,线程中使用的基本信号量函数有4个,它们都声明在头文件semaphore.h中。

sem_init函数
该函数用于创建信号量,其原型如下:

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

该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。 
pshared控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则信号量就可以在多个进程之间共享,value为sem的初始值。调用成功时返回0,失败返回-1.

sem_wait函数
该函数用于以原子操作的方式将信号量的值减1。原子操作就是,如果两个线程企图同时给一个信号量加1或减1,它们之间不会互相干扰。它的原型如下:

int sem_wait(sem_t *sem);  

sem_post函数

该函数用于以原子操作的方式将信号量的值加1。它的原型如下:

int sem_post(sem_t *sem);  

与sem_wait一样,sem指向的对象是由sem_init调用初始化的信号量。调用成功时返回0,失败返回-1.

sem_destroy函数

该函数用于对用完的信号量的清理。它的原型如下:

int sem_destroy(sem_t *sem); 

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

三、信号量的函数使用

代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

  sem_t sem;

  void func1(void* arg)
  {
      sem_wait(&sem);
      int *running=arg;
      printf("thread running1\n");
      printf("%d\n",*running);
  }

  void func2(void* arg)
  {
      printf("pthread2 running\n");
      sem_post(&sem);
  }

  int main()
  {
      sem_init(&sem,0,0);
      pthread_t thread[2];
      int a=5;
      pthread_create(&(thread[0]),NULL,(void*)func1,(void*)&a);
      printf("main thread running\n");
      sleep(10);
      pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a);
      printf("main thread running2\n");
      pthread_join(thread[0],NULL);
      pthread_join(thread[1],NULL);
      sem_destroy(&sem);

      return 0;
  }

 首先创建信号量,第二个参数为0,表示这个信号量是当前进程的局部信号量,初始值为0. 
然后使用pthread_create()函数创建两个线程,传入参数a。 
线程1创建完成后,由于信号量初始化value=0,调用sem_wait会阻塞这个线程,信号量的值将减少1(此时<0),这个线程函数就会等待。 
主线程sleep(10)后,线程2创建并执行调用,sem_post用于使信号量的值增加1,此时线程1可以执行。 
使用pthread_join等待所创建的两个线程的结束。

编译:

 gcc testSem.c -o testSem -lpthread
 ./testSem 

输出:

main thread running
main thread running2
pthread2 running
thread running1
5


————————————————
版权声明:本文为CSDN博主「wsqyouth」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013457167/article/details/78318932

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号量sem_init,sem_wait,sem_post 的相关文章

  • RestSharp 发布请求 - 具有 x-www-form-urlencoded 值的正文

    我正在使用邮递员并发出 api post 请求 其中我使用 x www form urlencoded 键 值添加正文 并且它在邮递员中工作正常 当我使用 RestSharp 包从 C 尝试时 出现了问题 我已尝试下面的代码但没有得到响应
  • AFNetworking 3 x-www-form-urlencoded 发布数据

    I m trying to post data with x www form urlencoded body Posting via postman it is ok 但我无法通过 afnetworking 3 做到这一点 这是我的代码
  • ASP.NET MVC 模型列表绑定

    这是我的模型 public class Items public string Foo get set public string Bar get set 控制器 public ActionResult Index var model ne
  • Flask - POST 错误 405 方法不允许

    我刚刚开始学习 Flask 我正在尝试创建一个表单 该表单将允许POST method 这是我的方法 app route template methods GET POST def template if request method PO
  • 检查线程状态,同时使其处于等待状态

    我想知道是否可以检查线程的状态 该线程可能处于可等待状态 但不一定如此 如果它处于可等待状态 我想将其保留在该状态 基本上 如何在不更改线程 可等待 状态的情况下检查线程的状态 通过等待 我的意思是如果我调用 wait pid 它会正确返回
  • Android Volley POST Json 到服务器

    我正在使用 Volley 在 Android 设备和网络服务器之间传输数据 我发现有关将数据列表发送到服务器的问题 例如 我的类将生成如下数据集 1 1 aID 5 2 aID 5 3 aID 5 4 aID 5 2 1 bID 3 2 b
  • 循环遍历 POST 数组

    我需要循环遍历 post 数组并提交它 stuff 1
  • 使用 jQuery 显示 POST 数据?

    我正在使用闪光灯网络摄像头拍照 它工作得很好 并通过 POST 返回一个 URL 我正在用 PHP 进行编码 并希望在收到该 POST 数据后显示该数据 问题是我不重新加载页面 我环顾四周 不确定是否动态加载这个数据数组 我应该去哪里寻找
  • 通过 facebook api 在 facebook feed 中发布 swf

    我正在使用下面的数组 feeddata array type gt flash method gt stream publish display gt iframe link gt https developers facebook com
  • Android - 使用 HttpURLConnection 来 POST XML 数据

    我遇到了一些死胡同 需要一些帮助 请 我对 Android 开发 以及一般编码 非常陌生 基本上我需要使用 HttpURLConnection 将 XML 数据发布到 URL 但无法让它工作 我的应用程序从 GET 请求读取并传递 XML
  • Unix cURL POST 使用文件中的内容到特定变量

    我已经搜索过这个答案 但没有找到任何有效或完全符合我的问题的答案 使用 Unix cURL 我需要将键 值对发布到服务器 密钥将是 MACs 换行符分隔的 MAC 地址文件的内容将是此 POST 的 VALUE 我试过了 curl d fi
  • JavaScript:发送 POST,重定向到响应

    我有一个带有 onclick 的图像 当单击事件触发时 我想发送 HTTP POST 并将 window location 重定向到 POST 的响应 我怎样才能做到这一点 只需将按钮绑定到表单元素的提交方法 重定向就会自然发生
  • 通过 POST 将 JSON 编码的变量从 PHP 传递到 Javascript

    我有一个多维数组 我想将其发送到带有 Javascript 的 PHP 脚本 该脚本解析 JSON 数据并将其绘制在 Google 地图上 我正在尝试使用表单来模拟它
  • 如何在 PHP 中检查不完整的 POST 请求

    当连接速度较慢的远程 Web 客户端无法发送完整的 POST 请求时 我遇到了问题multipart form data内容 但 PHP 仍然使用部分接收到的数据来填充 POST大批 结果一个值 POST数组可能不完整 并且可能会丢失更多值
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 捕获动态表中 HTML 元素的值

    我有从数据库生成的以下动态表
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 黑莓 - 带动画的加载/等待屏幕

    有没有办法显示 加载 屏幕带动画在黑莓手机上 选项 PME动画内容 多线程 图像集 定时器 计数器 标准轮辋 API 其他方式 有这个吗 Thanks 费明 安东尼 1 谢谢大家 你们给了我部分答案 我的最终解决方案 1 创建或生成 免费
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo

随机推荐

  • 湖北师范大学java习题汇编(超详细!已经进行了章节划分)

    表达式和流程控制语句 1 验证歌德巴赫猜想 一个充分大的偶数 xff08 大于或等于6 xff09 可以分解为两个素数之和 试编程序 xff0c 将 6至50之间全部偶数表示为两个素数之和 span class token keyword
  • OPENCV(五) 对给定的车牌进行字符分割

    下面有这样的一个车牌号 xff1a 现在的任务是将每一个字符区分开来 xff0c 并方框圈出来 完成这个功能需要以下的步骤 xff1a 1 灰度处理 span class token comment 读取图片 span image1 spa
  • SpringBoot整合forest(调用彩云API获取所有城市的实时天气)

    Forest简介 xff1a Forest是一个高层的 极简的轻量级HTTP调用API框架 相比于直接使用Httpclient您不再用写一大堆重复的代码了 xff0c 而是像调用本地方法一样去发送HTTP请求 环境配置 xff1a 因为本项
  • JAVA操作Kafka

    一 环境说明 1 电脑或你的服务器需要安装zookeeper和kafka 可以参考我的这篇博客 xff1a 请点击这里 xff01 2 项目中需要下面的依赖 xff1a span class token tag span class tok
  • Gradle使用本地maven仓库

    一 基本配置 在repositories下添加mavenLocal 方法 plugins span class token punctuation span id span class token string 39 java 39 spa
  • Docker容器编排

    一 简介和下载安装 1 简介 docker compose是Docker官方的开源项目 xff0c 可以管理多个docker容器组成的一个应用 你需要定义一个YAML格式的配置文件docker compose yaml xff0c 写好多容
  • 若依微服务(ruoyi-cloud)保姆版容器编排运行

    一 简介 项目gitee地址 xff1a https gitee com y project RuoYi Cloud 由于该项目运行有很多坑 xff0c 大家可以在git克隆拷贝到本地后 xff0c 执行下面的命令使master版本回退到本
  • 深入学习Tomcat----自己动手写服务器(附服务器源码)

    相信大多 Web 开发者对 Tomcat 是非常熟悉的 xff0c 众所周知 Tomcat 是一款非常好用的开源 Servlet 容器 xff0c 您一定对这个最流行的 Servlet 容器充满好奇 xff0c 虽然它并不像一个黑盒子那样让
  • Docker图形界面

    一 Portainer Portainer是一款轻量级的应用 xff0c 它提供了图形化界面 xff0c 用于方便地管理Docker环境 xff0c 包括单机环境和集群环境 官网 xff1a https www portainer io 运
  • Docker网络

    一 简介 从其架构和运行流程来看 xff0c Docker是一个C S模式的架构 xff0c 后端是一个松耦合架构 xff0c 众多模块各司其职 docker运行的基本流程为 xff1a 1 用户是使用Docker Client和Docke
  • NOKOV Seeker2.2动作捕捉软件与ROS的通信

    一 动捕软件安装与数据准备 1 在操作系统为Windows系统 xff0c 且位数为64位的电脑上 xff0c 以鼠标右键点击 以管理员身份运行 的方式 xff0c 运行 Seeker2 2 Tracker setup exe 文件 xff
  • NOKOV度量动捕软件教程(1):软件安装与设置

    一 软件安装 1 在操作系统为 64 位的 Windows 系统上 xff0c 关闭防火墙退出杀毒软件 xff08 360 电脑管家等 xff09 xff0c 以鼠标右键点击 以管理员身份运行 的方式 xff0c 运行 XINGYING 1
  • Pixhawk+PX4+NOKOV+C++SDK动捕飞控方案

    一 PX4配置 1 参数设置 xff0c 保存重启后生效 EKF2 AID MASK 61 24 EKF2 HGT MODE 61 2 二 动捕软件设置 1 配置参考 xff08 1 xff09 mocap nokov ROS Wiki 三
  • Pixhawk+PX4+NOKOV+VRPN动捕飞控方案

    一 PX4 配置 1 参数设置 xff0c 保存重启后生效 EKF2 AID MASK 61 24 EKF2 HGT MODE 61 2 二 VRPN配置 1 Nokov 动捕软件正确配置参数并启动 VRPN 2 使用 vrpn clien
  • JS-DOM— —节点操作

    五 节点操作 5 1 节点操作的作用 获取元素通常使用两种方式 1 利用DOM提供的方法获取元素 document getElementByld document getElementsByTagName0 document querySe
  • 立创EDA专业版入门经验分享(1)——对标AD的快捷操作

    作者团队在近期从Alitum Designer转战到立创EDA专业版 在习惯AD的工作方式后 xff0c 转到立创EDA专业版后磨合了很长一段时间 现将原来AD中的功能对应到立创EDA中的高级功能像大家分享 欢迎大家一起交流学习 本帖将作为
  • c语言中字符数组的理解

    数组的理解参考该文 对于字符数组 xff0c 当最后一个元素是 0 xff0c 则这个字符数组是一个字符串 xff1b 字符串可以通过首地址来打印输出 1 对于一维数组 int pack 3 61 1 2 3 printf 34 d 34
  • 如何减小与“大牛”的差距

    为什么同样的时间有的人可以漂亮的完成工作 xff0c 而有些人废了很大的力气也没有完成 xff1f 前者我们常常称之为 大牛 xff0c 后者我们常常叫他们 菜鸟 当然 大牛 都是相对而言的 xff0c 大牛 也不可能方方面面都非常厉害 x
  • 利用字符串的最后一个字符为‘\0‘的特性操作字符串

    利用末尾为 0 特性 xff0c 求字符串长度 xff0c 实现strlen int len 61 0 char str 61 34 hello 34 char p 61 str while p len 43 43 计算字符串的长度 p 4
  • 信号量sem_init,sem_wait,sem_post

    本篇文章是信号量的简单入门 xff0c 主要学习关于信号量四个函数的使用 文章综合整理了两篇文章 xff1a http blog csdn net qyz og article details 47189219 http blog csdn