信号量

2023-05-16

信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:  

extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  

sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。  

函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。  

函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。  

函数sem_destroy(sem_t *sem)用来释放信号量sem。 

信号量用sem_init函数创建的,下面是它的说明:
  #include<semaphore.h>
int sem_init (sem_t *sem, int pshared, unsigned int value);

这个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前里程的局部信号量;否则,其它进程就能够共享这个信号量。我们现在只对不让进程共享的信号量感兴趣。 (这个参数受版本影响), pshared传递一个非零将会使函数调用失败。

  这两个函数控制着信号量的值,它们的定义如下所示:
  
  #include <semaphore.h>
int sem_wait(sem_t * sem);
int sem_post(sem_t * sem);

这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。
sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它。
sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,介信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就会地等待直到有其它线程增加了这个值使它不再是0为止。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。
信号量这种“只用一个函数就能原子化地测试和设置”的能力下正是它的价值所在。还有另外一个信号量函数sem_trywait,它是sem_wait的非阻塞搭档。

最后一个信号量函数是sem_destroy。这个函数的作用是在我们用完信号量对它进行清理。下面的定义:
#include<semaphore.h>
int sem_destroy (sem_t *sem);
这个函数也使用一个信号量指针做参数,归还自己战胜的一切资源。在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。
与其它的函数一样,这些函数在成功时都返回“0”。

 

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

sem_t bin_sem;
void *thread_function1(void *arg)
{
      printf("thread_function1--------------sem_wait/n");
      sem_wait(&bin_sem);
      printf("sem_wait/n");
     while (1)
     {
     }
}

 

void *thread_function2(void *arg)
{
     printf("thread_function2--------------sem_post/n");
     sem_post(&bin_sem);
     printf("sem_post/n");
    while (1)
   {
   }
}



int main()
{
       int res;
       pthread_t a_thread;
       void *thread_result;

      res = sem_init(&bin_sem, 0, 0);
      if (res != 0)
      {
             perror("Semaphore initialization failed");
      }
      printf("sem_init/n");
      res = pthread_create(&a_thread, NULL, thread_function1, NULL);
     if (res != 0)
     {
           perror("Thread creation failure");
      }
     printf("thread_function1/n");
     sleep (5);
     printf("sleep/n");
     res = pthread_create(&a_thread, NULL, thread_function2, NULL);
     if (res != 0)
     {
            perror("Thread creation failure");
      }
     while (1)
    {
    }
}


sem_init
thread_function1
thread_function1--------------sem_wait
sleep
thread_function2--------------sem_post
sem_wait
sem_post

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

信号量 的相关文章

  • 本地vnc(TigerVNC)远程linux server,提示拒绝连接

    可能原因 amp 分析 xff1a 可确认下初始的系统环境变量是否被改动 xff0c 如新安装的anaconda自动添加到环境变量 xff0c 且放置在系统的原有环境变量的前面 xff0c 可尝试将后加的环境变量编辑到后面 xff0c 再重
  • 高质量嵌入式Linux C编程第一次博客作业

    1 xff1a linux 与 Unix的关系 xff1f 某些PC机的Unix和Linux在实现方面相类似 几乎所有的商业Unix版本都基本支持同样的软件 程序设计环境和网络特性 然而 xff0c Linux和Unix的商业版本依然存在许
  • java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration xff0c 是 JDK 1 5 中引入的新特性 xff0c 存放在 java lang 包中 下面是我在使用 enum 过程中的一些经验和总结 xff0c 主要包括如下内容 xff1a 1 原始的
  • RBAC用户、角色、权限、组设计方案

    设计一个灵活 通用 方便的权限管理系统 在这个系统中 xff0c 我们需要对系统的所有资源进行权限控制 xff0c 那么系统中的资源包括哪些呢 xff1f 我们可以把这些资源简单概括为静态资源 xff08 功能操作 数据列 xff09 和动
  • ssh 怎样以root用户登录

    sudo vim etc ssh sshd config 找到并用 注释掉这行 xff1a PermitRootLogin prohibit password 新建一行 添加 xff1a PermitRootLogin yes 重启服务 s
  • python 函数内部修改外部变量

    如果内部修改外部变量需要nonlocal xff0c global def f1 print 34 in f1 34 num 61 111 def f2 nonlocal num num 61 222 print num f2 print
  • python 列表生成式将两个列表组合

    l1 61 1 2 3 4 5 l2 61 10 20 30 40 50 l3 61 x y for x in l1 for y in l2 if y x 61 61 10 l4 61 x y for x in l1 for y in l2
  • python monkey脚本

    import wx import wx xrc import os import threading import thread import logging import re import time import csv import
  • tiny210 ubuntu下sd卡分区

    1 ubuntu实现SD Flasher exe原理 友善官方给出的烧录uboot的工具是SD Flasher exe xff0c 这个工具只能在windows下使用 由于本人电脑无法打开这个工具 xff0c 所以在windows下无法制作
  • MonkeyScript API 文档

    一 前言 本文档记录了和 MonkeyScript 相关的 API 文档 xff0c 由承香墨影整理 所有 API 描述均来自 MonkeySourceScript java 也可以自行查看源码 xff0c 在线阅读地址 xff1a htt
  • mysql教程01

    常用数据类型如下 xff1a 整数 xff1a int xff0c bit小数 xff1a decimal字符串 xff1a varchar char日期时间 date time datetime枚举类型 enum decimal表示浮点数
  • mysql02

    查看版本 xff1a select version 查看所有数据库 xff1a show databases xff1b 创建数据数据库 xff1a create database test01 charset 61 utf8 使用数据库
  • 类linux驱动模块框架module_init(init_fun)在STM32上的实现

    原文 xff1a https zhuanlan zhihu com p 81309285 设计思想 利用编译器的特性 xff0c 在程序编译时将各模块初始化函数顺序存放到内存的指定地址 xff0c 然后在程序运行时main函数从这块内存区域
  • 国内如何快速下载keil的pack文件包(干货)

    想要在国内如何快速下载keil的pack文件包 xff0c 真的是有点麻烦的 xff0c 不过网上找了一个好方法 xff0c 可以记录下 在keil的pack 官网 MDK5 Software Packs keil com 查找自己想要的p
  • 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)

    基于网上网友的代码 xff0c 自己在单片机上实现 xff0c 特此记录分享之 基于https blog csdn net yyx112358 article details 78877523 使用KEIL C51实现的简单合作式多任务操作
  • [技术分享] 用Python玩转3D人体姿态估计

    转载自3D视觉开发者社区用户 mudi 原文链接 xff1a 技术分享 用Python玩转3D人体姿态估计 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 导语 姿态估计 xff0c 一直是近几年的研究热点 它就是根据画
  • 获取相机内参和外参的方法

    作者 童虎 编辑 3D视觉开发者社区 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 相机内参 xff1a 是与相机自身特性相关的参数 xff0c 比如相机的焦距 像素大小 相机外参 xff1a 在世界坐标系中的参数 x
  • 计算机专业英语词汇1695词(35天记忆)

    计算机专业英语词汇1695词 xff08 35天记忆 xff09 声明 xff1a 英语其实就是一个工具 xff0c 你会发现很多资料文献或者一些软件基本都涉及到英文 xff0c 尤其从事计算机的体验极深哈 这篇博客总共提供1695个专业词
  • PID调试软件(C#、模拟、仿真)

    突然想起要玩下PID xff0c 于是又想到强大的C xff0c 好吧 xff0c 搞个小软件玩下 首先花点时间学习PID xff0c 用的都是网上资料 xff0c 开始是先看http www amobbs com thread 50433
  • [docker报错] 用docker build构建python项目镜像时,执行到RUN pip install报错

    问题描述 用docker build构建python项目镜像 xff0c 执行到RUN pip install后 xff0c 长时间没有响应后报错 xff0c 原本以为是网速太慢导致下载失败 后来看到这篇 xff08 docker buil

随机推荐

  • 软件测试面试中项目介绍宝典

    面对 面试造飞机 xff0c 工作拧螺丝 的杯具 xff0c 我们必须做好准备工作 xff1a 打有准备的仗 测试的面试相对于开发的面试来说 xff0c 对于技术的询问其实相对来说较少的 xff0c 技术这一块主要针对以下几个方面 测试理论
  • 详解超声波测距模块HC-SR04的使用

    1 模块简介 HC SR04超声波模块常用于机器人避障 物体测距 液位检测 公共安防 停车场检测等场所 HC SR04超声波模块主要是由两个通用的压电陶瓷超声传感器 xff0c 并加外围信号处理电路构成的 如图 xff1a 两个压电陶瓷超声
  • Docker安装图形界面Shipyard

    Shipyard xff08 github xff09 是建立在docker集群管理工具Citadel之上的可以管理容器 主机等资源的web图形化工具 包括core和extension两个版本 xff0c core即shipyard主要是把
  • # 转载chmod+X与chmod777

    chmod 43 X与chmod777 原文 xff1a https blog csdn net qq 42982742 article details 103690119 chmod 43 x 是将文件状态改为可执行 xff0c 而chm
  • C++几个适合的OJ刷题网站

    RQNOJ VIJOS 这两个还比较基本 xff0c 题目也是中文的 对于准备NOI或者省选的话 xff0c BZOJ是不错的 ACM什么的 xff0c 最好就做POJ xff0c SGU xff0c Codeforces等题库 xff0c
  • Android系统深度游

    项目原因 xff0c 让我们必须深入探索Android系统 xff0c 完成对之前的我们来说比较艰巨的任务 这样 xff0c 我们开启了Android深度游 Android这个系统 xff0c 应用层开发还是比较舒服的 xff0c Goog
  • IT痴汉的工作现状56-耳鸣

    自从这个项目启动 xff0c 与客户方的沟通就逐渐多了起来 xff0c 沟通的方式是语音会议 也不知从什么时候起 xff0c 每天的会议时间变得很长很长 尤其是定位复杂问题时 xff0c 一个会议就要4个小时 张伟是从项目开始买的耳机 xf
  • 我的2020---熬过去

    恰逢周末 xff0c 本人自认为过了一个美好的圣诞节之后 xff0c 在深圳图书馆开始思考我的第十一个年终总结了 提笔之前 xff0c 我翻看了去年的总结 xff0c 想到了我还有一套书没有读完 xff0c 那就是 大败局 2020结束还有
  • 我的2022-工程师文化的思考

    没有想到 xff0c 今年大环境的变化可谓是大开大合 xff0c 超出想象 各行各业都遭到强大的挑战 xff0c 是泯灭还是苟活 xff0c 亦或是再创辉煌 xff0c 时也命也 在此情况下的个人 xff0c 最好的选择是跟公司抱团取暖 x
  • 我的2013---全速前行

    一晃 xff0c 自己也步入了而立之年 在IT这个行业 xff0c 而立 xff0c 意味着很多事情 现实的骨感不得不让自己想得更多 xff0c 但是到头来发现自己能做的仍只有继续好好工作 其实年龄是IT行业永恒的话题 xff0c 但我还是
  • 用户名 不在 sudoers文件中,此事将被报告。

    继续昨天的故事 话说昨天新建了一个帐号linc xff0c 今天在执行sudo时回显一个很吓人的信息 xff1a sudo password for linc linc 不在 sudoers 文件中 此事将被报告 这是要去哪儿报告呢 xff
  • Git冲突:commit your changes or stash them before you can merge.

    今天用git pull来更新代码 xff0c 遇到了下面的问题 xff1a error Your local changes to the following files would be overwritten by merge xxx
  • Android问题集锦之二十八:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    错误描述为 xff1a java lang IllegalStateException You need to use a Theme AppCompat theme or descendant with this activity 起因
  • Docker实践6:Cannot connect to the Docker daemon.

    正在免费适用着Aliyun主机 xff0c 当然要用docker来部署我的服务器啦 但是今天碰到了题目的问题 xff0c 细节如下 xff1a span class hljs comment docker info span FATA sp
  • 一个简单的自定义通信协议(socket)

    转自 xff1a http vtrtbb javaeye com blog 849336 这是转自javaeye的一篇文章 xff0c 作者是vtrtbb 按照网络通信的传统 xff0c 我们都会自定义协议 xff0c 这有很多好处 xff
  • ImageView 设置图片

    android doc中是这样描述的 xff1a public void setImageResource int resId 这是其中的一个方法 xff0c 参数resld是这样 xff1a ImageView setImageResou
  • Android问题集锦之八:调用其他程序中的activity和Permission Denial: starting Intent 错误解决办法

    今天想调试多个task中栈的情况 xff0c 在测试程序中调用另一个程序的activity xff0c 代码片段如下 xff1a btnStartX 61 Button findViewById R id btnStartX btnStar
  • VB.NET串口通信例子--我的回忆录

    这是我3年前的一个例子 xff0c 最近翻出来回忆一下 串口是计算机上一种非常通用设备通信的协议 大多数计算机包含两个基于RS232的串口 xff0c 现在配电脑好像只有一个 串口同时也是仪器仪表设备通用的通信协议 xff1b 很多GPIB
  • TiDB-部署(tiup方式)

    一 环境 ip xff08 非真实 xff09 功能配置192 168 1 1中控机 xff08 监控等位置所在 xff09 最低192 168 1 2TIDB PD TIFLUSH 如果机器多可以分开 高192 168 1 3TIKV 1
  • 信号量

    信号量的数据类型为结构sem t xff0c 它本质上是一个长整型的数 函数sem init xff08 xff09 用来初始化一个信号量 它的原型为 xff1a extern int sem init P sem t sem int ps