Linux 信号量及其操作函数
信号量的本质就是一个计数器,描述临界资源的数目大小。(最多能有多少资源分配给线程)
目录
一、什么是信号量?
二、信号量申请和释放的过程(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 信号量及其操作函数相关推荐
- 封装一个信号量集操作函数的工具
信号量的概念参见这里. 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm; /* Ownership an ...
- linux协议栈skb操作函数,linux协议栈skb操作函数
1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...
- linux协议栈skb操作函数
一. SKB_BUFF的基本概念 1. 一个完整的skb buff组成 (1) struct sk_buff--用于维护socket buffer状态和描述信息 (2) header data--独立 ...
- linux pv 信号量,Linux信号量PV操作
1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作. 2://利用信号量实现pv操作 3:#include 4:#include 5:#include ...
- linux c 内存操作函数 简介
bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...
- Linux c 目录操作函数scandir
头文件:#include <dirent.h> 定义函数:int scandir(const char *dir, struct dirent **namelist, nt (*sel ...
- linux的scandir函数如何排序,Linux c 目录操作函数scandir
头文件:#include 定义函数: int scandir (const char *dir, struct dirent **namelist, nt (*select) (const s ...
- linux文件信号量删除,linux信号量_閑の洎茬
1.1 创建信号量 int semget( key_t key, //标识信号量的关键字,有三种方法:1.使用IPC--PRIVATE让系统产生, // 2.挑选一个随机数,3.使用ftok从文件 ...
- 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 ...
- linux 文件操作函数,Linux下的文件操作函数及creat用法
编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...
最新文章
- Windows 10下安装Miniconda3
- java连接weblogic_java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
- rails笔记 cache系统
- 关于C++14:你需要知道的新特性
- Linux下查看版本及系统信息
- 2018ACM-ICPC国际大学生程序设计竞赛亚洲区域赛(青岛站)赛后总结
- 11.4 Daily Scrum
- java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码
- 使用WebBrowser自动登录阿里妈妈网站
- Linux下的虚拟机安装
- maven 内存不足_如何修复Maven内存不足问题
- 突发!甲骨文严查Java授权,很多公司连夜卸载了JDK,启用OpenJDK 替代....
- XCode5设置字体
- 微星z370安装linux系统,微星Z370-A PRO主板u盘装系统win10教程
- 《金狐系统维护盘》五周年纪念版【简洁易用,强大实用】
- html pc端单位转换,pc是什么单位?
- 大疆2018校招笔试题
- 视频融合应用没听说过?
- 【阿朱洞察】中国大数据行业的下一步走向
- Cruzer Profile 原理分析