目录

  • 信号量概述:
    • 一:信号量的本质
    • 二:信号量的机制
  • 相关的API
    • ***①int semget(key_t key,int num_sems,int sem_flags);***
    • ***②int semop(int semid,struct sembuf semoparray[ ],size_t semops);***
    • ***③int semctl (int semid,int sem_num,int cmd,…)***
  • 例子

信号量概述:

一:信号量的本质

   信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。==当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

二:信号量的机制

  信号量用于实现进程间的互斥与同步,而不是用于存储进程间的通信数据。举例子来理解这句话:
  把一个临界资源(也可以认为是共享内存)比作一个上了锁的房间,某人比作一个进程,而开锁的钥匙就是信号量。某人有钥匙的话,就能开锁进入房间里,做它需要做的事情,如果这时候有第二个人想进入房间里的话,是进不去的,因为它没有钥匙(信号量(钥匙)<0)。直到进去的那个人出了房间把钥匙放在某个地方(使信号量(钥匙)>=0),然后第二人拿到了钥匙,才能渠道房间里去。这钥匙起到的作用就是信号量。若有100把钥匙,可以使101个人同时进入房间。
  PV操作的定义:
P:
  ①将信号量S的值减1,即进行S = S-1;
  ②如果S < 0,则该进程进入阻塞队列;
  ③如果S >= 0, 则该进程继续执行;
  ④执行一次P操作其实就是意味请求分配一个资源。
V:
  ①将信号量S的值加1,即 S = S + 1;
  ②如果S > 0,则该进程继续执行;
  ③如果S < 0, 则释放阻塞队列中的第一个等待信号量的进程;
  ④执行一次V操作其实就是意味释放一个资源。

相关的API

头文件:

       #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>

①int semget(key_t key,int num_sems,int sem_flags);

  功能:(semphore get)创建或获取信号量,返回信号量D。
  参数
     key:信号量索引值,可使用ftok获取
    num_sems:指定需要的信号量数目,它的值几乎总是1
    sem_flags:一般用IPC_CREAT 加上权限创建信号量集
  返回值:成功返回信号集的ID;失败返回 ==-1 ==;

②int semop(int semid,struct sembuf semoparray[ ],size_t semops);

  功能:(semphore operation)它的作用是改变信号量的值(PV操作)
  参数
     semid:目标信号量的ID号
    semoparray[]:结构体数组,它有三个成员:
         (1)sem_num:需要操作第几个信号量;
         (2)sem_op:信号量的值,-1为p操作(拿钥匙);1为v操作(放钥匙)。
         (3)sem_flg:一般赋值SEM_UNDO相当于wait;
     semops :semoparray[] 数组的个数。
  返回值: 成功返回0;失败返回 -1;

③int semctl (int semid,int sem_num,int cmd,…)

如果有第四个参数,它通常是一个union semun结构,定义如下:

 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) */};

控制信号量函数。用来控制信号,比如初始化,移除信号量等。
参数说明:
    1. semid 被操作目标信号量的ID号;
    2. sem_num 信号量的个数,即需要操作第几个信号量;从0开始计数。
    3. cmd 操作指令,它有几个宏,常用一般用SETVAL (初始化信号量的值相当于钥匙的数量)IPC_RMID:用于删除一个信号量标识符。
    4. 其他 这个参数,是配合SETVAL指令来使用,它是个联合体而且需要定义。

例子

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include<stdio.h>
#include<stdlib.h>
//       int semget(key_t key, int nsems, int semflg);
//       int semctl(int semid, int semnum, int cmd, ...);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 Pop(int semid){int ret;struct sembuf sembuf[1];sembuf[0].sem_num=0;sembuf[0].sem_op=-1;sembuf[0].sem_flg=SEM_UNDO;ret=semop(semid,sembuf,1);if(ret == -1){printf("get key faied\n");}else{printf("get key sucess\n");}
}
void Vop(int semid){int ret;struct sembuf sembuf[1];sembuf[0].sem_num=0;sembuf[0].sem_op=1;sembuf[0].sem_flg=SEM_UNDO;ret=semop(semid,sembuf,1);if(ret == -1){printf("return key faied\n");}else{printf("return key sucess\n");}
}
int main(){key_t key;int semid;int pid;union semun semclt;semclt.val=0;   //信号量的数量key=ftok(".",6);semid=semget(key,1,IPC_CREAT|0666);semctl(semid,0,SETVAL);//删除信号量IDpid=fork();if(pid>0){Pop(semid);  //  减去一个信号量,由于<0程序阻塞printf("this is parent pid\n");semctl(semid,0,IPC_RMID,semctl);}                                                                  else if(pid==0){printf("this is child pid\n");Vop(semid);//加上一个信号量。使信号量=0父进程运行}else{printf("fork faile\n");}return 0;
}

16信号量(semaphore)相关推荐

  1. Linux 学习笔记16 信号量

    Linux 学习笔记16 信号量Semaphore 信号量概念 信号量(或信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是控制进程(或线程)同步(谁先执行,谁后执行 ...

  2. JDK1.8 信号量(Semaphore)的基本使用

    介绍 信号量支持多线程同时并发,但是同时并发线程数是确定的,起到了限流的作用.比如: 临界资源的数量是5个,那么则可以同时支持5个线程进入临界资源,待进入临界资源的线程退出后,其他线程才能进入来,也就 ...

  3. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  4. Python 线程信号量 semaphore - Python零基础入门教程

    目录 一.Python 线程信号量 semaphore 简介 二.Python 线程信号量 semaphore 原理 三.Python 线程信号量 semaphore 函数介绍 四.Python 线程 ...

  5. java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore

    先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...

  6. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  7. java 信号量Semaphore

    在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固 ...

  8. 经典线程同步 信号量Semaphore

    信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...

  9. .Net 下信号量(Semaphore)的一种实现

    动机 从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C+ ...

  10. python 信号量 semaphore

    信号量 信号量(英语:semaphore)又称为信号标, 是一个同步对象,用于保持在0至指定最大值之间的一个计数值. 当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一: 当线 ...

最新文章

  1. 【 FPGA 】数字系统设计方法的演变
  2. python里面temp是啥-Python模块学习:tempfile 临时文件(夹)操作
  3. python 装饰器 三 (带有参数的装饰器)
  4. 科学解释成功者成功的秘诀
  5. 幅度和幅值有区别吗_你知道避雷器与浪涌保护器的区别吗?
  6. Crash Course经济学笔记
  7. Irrlicht引擎例子说明及中文链接
  8. 继承 actionSupport
  9. Coin3D快速上手教程
  10. 腾讯云服务器怎么增加容量,腾讯云服务器磁盘扩容问题小记
  11. Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
  12. 【社会经验】如何高效的学习?
  13. OSI七层模型的功能以及设备
  14. android手机导出日志adb logcat
  15. c语言键位大全,按键用法
  16. 计算机网络笔记及思维导图(1)——概述
  17. SDNU 1309.啤酒和饮料
  18. LTspice基础教程-009.LTspice波形测量
  19. Python仿真|如何操纵足球比赛的输赢
  20. linux录屏和截图软件

热门文章

  1. c++ Qt5学习笔记 2021-1-21(文件系统QFile、QFileInfo、QDir、QFileSystemWatcher等使用,读取文本显示乱码,QDataStream二进制字节流读写)
  2. 基于存储的C语言文件操作常规问题分析(文本文件与二进制文件)
  3. 干货:O2O美团外卖四部曲
  4. 在线编辑php文件的代码
  5. 截止2010年3月25日的流量统计
  6. 群辉查看硬盘存储占用的方式
  7. 取得WINDOWS的管理员权限
  8. yolov3 训练终端参数涵义
  9. Android自定义控件三部曲
  10. Kubernetes网络三部曲之三 ~ NodePort vs LoadBalancer vs Ingress