信号量的本质就是一个计数器,描述临界资源的数目大小。(最多能有多少资源分配给线程)


目录

一、什么是信号量?

二、信号量申请和释放的过程(PV操作)

三、信号量操作函数

1、信号初始化 sem_init

2、申请信号量 sem_wait

3、释放信号量 sem_post

4、销毁信号量 sem_destroy


一、什么是信号量?

电影院预售1000张票,一旦预定成功,就会有你的位置,其他人无法占用;每有一个人退票或者看完电影,这张票就返还给电影院。

现在这1000张票就是一个临界资源 tickets,我们把这个临界资源划分成为一个个小资源,分配给线程,这样可以允许多个线程同时访问临界资源,从而实现并发。

信号量是一个计数器,这个计数器被合理使用,能够达到对临界资源预定的目的。每个线程要想访问临界资源,都得申请信号量!

二、信号量申请和释放的过程(PV操作)

其实信号量的申请和释放过程,和之前说线程资源冲突的场景有点类似。假设tickets = 1000,最基本的理解如下:

申请信号量 ==》 tickets --

释放信号量 ==》 tickets ++

但是由于 ticket-- 或者 tickets ++这个操作不是原子的,会被其他线程“乱入”,所以我们要对其进行加锁,等到自增或者自减结束以后,我们再解锁。这就是典型的PV操作

tickets = 0,此时说明票已经全部售出了,如果还有线程要来申请,那就只能让这些线程暂时挂起,等其他线程释放信号量以后,再给唤醒挂起的线程。

三、信号量操作函数

Linux专门为信号量提供一种数据结构,和之前学的信号集一样

sem_t sem;    //创建一个信号量

1、信号初始化 sem_init

创建好的信号量只是一个空壳,初始值是多少,即要出售多少张票,我们并不知道,因此需要对信号量进行初始化。下面就依次介绍sem_init的各个参数。

第一个参数,信号量的地址,即要初始化哪个信号量。

第二个参数,选择 线程间共享这个信号量 or 进程间共享这个信号量。如果 pshared = 0,线程间共享;pshared = 1,进程间共享。

第三个参数,设置信号量的初始值。

返回值:成功返回0,失败返回-1

2、申请信号量 sem_wait

你可以将上述信号量申请过程当作这个函数的底层实现。参数是 要申请的信号量的地址。成功返回0,失败返回-1。

3、释放信号量 sem_post

这里的释放信号量和下面的销毁不一样,这里的释放只是把申请到的信号量归还给临界资源,而销毁是将信号量这个计数器给销毁。此时计数器的值 +1。参数是 要释放的信号量的地址。成功返回0,失败返回-1。

4、销毁信号量 sem_destroy

调用以后,信号量这个计数器会被销毁。参数是 要销毁的信号量的地址。成功返回0,失败返回-1。

Linux 信号量及其操作函数相关推荐

  1. 封装一个信号量集操作函数的工具

    信号量的概念参见这里. 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm;  /* Ownership an ...

  2. linux协议栈skb操作函数,linux协议栈skb操作函数

    1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...

  3. linux协议栈skb操作函数

    一. SKB_BUFF的基本概念 1. 一个完整的skb buff组成 (1) struct sk_buff--用于维护socket buffer状态和描述信息 (2) header data--独立 ...

  4. linux pv 信号量,Linux信号量PV操作

    1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作. 2://利用信号量实现pv操作 3:#include 4:#include 5:#include ...

  5. linux c 内存操作函数 简介

    bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...

  6. Linux c 目录操作函数scandir

    头文件:#include  <dirent.h> 定义函数:int  scandir(const char *dir, struct dirent **namelist, nt (*sel ...

  7. linux的scandir函数如何排序,Linux c 目录操作函数scandir

    头文件:#include 定义函数: int   scandir (const char *dir, struct dirent **namelist, nt (*select)  (const  s ...

  8. linux文件信号量删除,linux信号量_閑の洎茬

    1.1 创建信号量 int semget( key_t key,   //标识信号量的关键字,有三种方法:1.使用IPC--PRIVATE让系统产生, // 2.挑选一个随机数,3.使用ftok从文件 ...

  9. linux i2c子系统代码分析3 ---操作函数i2c_add_adapter i2c_add_numbered_adapter介绍

    二.i2c子系统操作函数,i2c-core.c 1. kernel/driver/linux/i2c/i2c-core.c /**  * i2c_add_adapter - declare i2c a ...

  10. linux 文件操作函数,Linux下的文件操作函数及creat用法

    编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...

最新文章

  1. Windows 10下安装Miniconda3
  2. java连接weblogic_java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
  3. rails笔记 cache系统
  4. 关于C++14:你需要知道的新特性
  5. Linux下查看版本及系统信息
  6. 2018ACM-ICPC国际大学生程序设计竞赛亚洲区域赛(青岛站)赛后总结
  7. 11.4 Daily Scrum
  8. java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码
  9. 使用WebBrowser自动登录阿里妈妈网站
  10. Linux下的虚拟机安装
  11. maven 内存不足_如何修复Maven内存不足问题
  12. 突发!甲骨文严查Java授权,很多公司连夜卸载了JDK,启用OpenJDK 替代....
  13. XCode5设置字体
  14. 微星z370安装linux系统,微星Z370-A PRO主板u盘装系统win10教程
  15. 《金狐系统维护盘》五周年纪念版【简洁易用,强大实用】
  16. html pc端单位转换,pc是什么单位?
  17. 大疆2018校招笔试题
  18. 视频融合应用没听说过?
  19. 【阿朱洞察】中国大数据行业的下一步走向
  20. Cruzer Profile 原理分析

热门文章

  1. html网页纯静态花店购物网站源码div+css页面将计30页,大学生毕业设计源码(源码下载)
  2. 软件测试简历,这一点你是否漏掉
  3. 鸿蒙开发之拨打电话号码
  4. FishC笔记—33 讲 异常处理:你不可能总是对的2
  5. 要大容量有福了 Surface P4拆解可更换SSD!
  6. 中科大EPC抢预约考试脚本简单版
  7. 汤国安:GIS教育可能要崩盘
  8. 网络安全之渗透实战学习
  9. 《商务与经济统计》练习:案例2-1:Pelican商店促销活动效果评估
  10. 微信人格专业测试软件,如何在微信公众号中关联《九型人格测试专业版》小程序?...