第10章 Posix 信号量
10.1 概述
10.1.1 信号量类型
Posix有名信号量:使用Posix IPC名字,可用于进程或线程间同步;
Posix基于内存的信号量:也叫做无名信号量,存放在共享内存中,可用于进程或线程间同步;
System V信号量:在内核中维护,可用于进程或线程间同步。
(1)二值信号量:(Posix 信号量)
(2)计数信号量:(Posix 信号量)
(3)信号量集:(System V信号量)
10.1.2 信号量三种操作
(1)创建(create)
(2)等待(wait),P操作,信号量-1
(3)挂出(post),V操作,信号量+1
10.1.3 信号量、互斥锁、条件变量三者差异
(1)互斥锁必须是给它上锁的线程进行解锁,信号量可以由其他线程挂出;
(2)互斥锁要么锁住,要么解开(类似于二值信号量);
(3)信号量有一个与之关联的计数器,信号量挂出操作后总是被记住;条件变量发送信号后,如果没有线程等待该条件变量,那么该信号就丢失。
Posix基本原理指出有了互斥锁和条件变量还提供信号量的原因是:信号量主要目的是提供进程间同步,互斥锁和条件变量是线程间同步的。但是它们都可以用于进程间同步和线程间同步,看具体的场景选择同步方式。
10.2 有名信号量

| 头文件 |
#include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <semaphore.h> |
| 创建或打开 | sem_t *sem_open(const char *name, int oflag); |
| sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); | |
| 关闭 | int sem_close(sem_t *sem); |
| 删除 | int sem_unlink(const char *name); |
| 等待 | int sem_wait(sem_t *sem); |
| 尝试等待 | int sem_trywait(sem_t *sem); |
| 超时等待 | int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); |
| 挂起 | int sem_post(sem_t *sem); |
| 获取信号量值 | int sem_getvalue(sem_t *sem, int *sval); |
| 说明 | Link with -pthread. |
10.3 无名信号量
| 头文件 | #include <semaphore.h> |
| 初始化 | int sem_init(sem_t *sem, int pshared, unsigned int value); |
| 销毁 | int sem_destroy(sem_t *sem); |
| 说明 | Link with -pthread. |
| 用于不同线程:pshared = 0;用于不同进程:pshared = 1,在共享内存中创建无名信号量 |
第10章 Posix 信号量的更多相关文章
- 多线程编程之Apue3rd_Chapter15.10之posix信号量
看了APUE的chapter15,只重点看了15.10,学习了posix信号量.Posix信号量比起xsi信号量的优点是性能更好,在Linux3.2.0平台上性能提升很大.其中命名信号量使用方法如下. ...
- 第三十九章 POSIX信号量与互斥锁
POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name ...
- POSIX信号量与互斥锁实现生产者消费者模型
posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_o ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
- 《Unix网络编程》卷2 读书笔记 第2章- Posix IPC
1. 概述 Posix IPC 包括:Posix消息队列.Posix信号量.Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点. 本章讲述所有这些共同属性:用于标识 ...
- Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
- 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)
第10章 RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...
- posix信号量与互斥锁
1.简介 POSIX信号量是一个sem_t 类型的变量,但POSIX 有两种信号量的实现机制:无名信号量和命名信号量.无名信号量可以用在共享内存的情况下, 比如实现进程中各个线程之间的互斥和同步.命名 ...
- linux c编程:Posix信号量
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...
随机推荐
- 七牛云存储Python SDK使用教程 - 上传策略详解
文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k ...
- Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
- PouchDB:可随时同步的开源JavaScript数据库
PouchDB是一个开源的JavaScript数据库,可以运行在浏览器中.PouchDB的数据存储.处理方式受到了Apache CouchDB的启发(CouchDB是一个面向文档的数据库,可通过Jav ...
- CSQuery 简单测试
1. 使用环境 vs2010 ,csquery 2. 测试的内容 学习了解csquery 3. 代码 添加csquery 的就不用写了 测试的例子是获取我的博客的信息,使用webbrowser 控件 ...
- linux -samba
yum install samba samba-client samba-swat samba-common-3.6.9-151.el6.x86_64 //主要提供samba服务器的设置文件与设置文件 ...
- 【Swift】读取文本文件字符串
var str:NSString = NSString.stringWithContentsOfFile(_srcouceFilePath,encoding:NSUTF8StringEncoding, ...
- redis报错Windows error 0x70(a large memory)
redis报错Windows error 0x70 redis 嫌弃你内存不够了,就给你不开第二个实例. The Windows version of Redis allocates a large ...
- 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转
表现层就是看到的东西,比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了,存东西用的 ,DAO层就是将访问数 ...
- Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应
在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: function Sure(obj) { var statu ...
- [Hibernate] - Annotations - Many To Many
Hibernate annotation 多对多: 下面测试例子会自动生成一张表:card,这张是bank和user表的映射表.里头是bank_id和user_id两个组合字段. 如果想在这张映射表中 ...