Posix 信号量
作用
信号量的值为0或正整数,就像红灯与绿灯,用于指示当前是否可以接受任务.
信号量对进程和线程都适用.
gcc编译时需加-lpthread
基本函数
信号量的相关函数与标准文件函数非常相似,可以理解文件的读写,只是读写对象不同而已
#include <semaphore.h>
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_post(sem_t *sem);
int sem_getvalue(sem_t *sem,int *valp);
例子
#include "./unpipc.h"
#include <semaphore.h>
#include <pthread.h>
#define NBUFF 10
#define SEM_MUTEX "/mutex"
#define SEM_NEMPTY "/empty"
#define SEM_NSTORED "/nstored"
int nitems;
struct {
int buff[NBUFF];
sem_t *mutex,*nempty,*nstored;
} shared;
void *produce(void *), *consume(void *);
int main(int argc,char *argv[]){
pthread_t tid_produce,tid_consume;
if(argc != 2)
err_quit("usage: sem <#items>");
nitems=atoi(argv[1]);
shared.mutex=sem_open(SEM_MUTEX,O_CREAT|O_EXCL,0644,1);
shared.nempty=sem_open(SEM_NEMPTY,O_CREAT|O_EXCL,0644,NBUFF);
shared.nstored=sem_open(SEM_NSTORED,O_CREAT|O_EXCL,0644,0);
pthread_setconcurrency(2);
pthread_create(&tid_produce,NULL,produce,NULL);
pthread_create(&tid_consume,NULL,consume,NULL);
pthread_join(tid_produce,NULL);
pthread_join(tid_consume,NULL);
sem_unlink(SEM_MUTEX);
sem_unlink(SEM_NEMPTY);
sem_unlink(SEM_NSTORED);
exit(0);
}
void *
produce(void *arg){
int i;
for(i=0;i<nitems;i++){
sem_wait(shared.nempty);
sem_wait(shared.mutex);
shared.buff[i%NBUFF]=i;
sem_post(shared.mutex);
sem_post(shared.nstored);
}
return(NULL);
}
void *
consume(void *arg){
int i;
for(i=0;i<nitems;i++){
sem_wait(shared.nstored);
sem_wait(shared.mutex);
if(shared.buff[i%NBUFF] != i)
printf("buff[%d]=%d\n",i,shared.buff[i%NBUFF]);
sem_post(shared.mutex);
sem_post(shared.nempty);
}
return(NULL);
}
Posix 信号量的更多相关文章
- 第10章 Posix 信号量
10.1 概述 10.1.1 信号量类型 Posix有名信号量:使用Posix IPC名字,可用于进程或线程间同步: Posix基于内存的信号量:也叫做无名信号量,存放在共享内存中,可用于进程或线程间 ...
- 进程间通信之POSIX信号量
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
- POSIX信号量
DESCRIPTION POSIX 信号量允许进程间和线程间同步他们的操作. 一个信号量是一个整型(integer),其值不能小于0. 信号量允许2中操作:给信号量的值加1(sem_post); 给信 ...
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- posix信号量与互斥锁
1.简介 POSIX信号量是一个sem_t 类型的变量,但POSIX 有两种信号量的实现机制:无名信号量和命名信号量.无名信号量可以用在共享内存的情况下, 比如实现进程中各个线程之间的互斥和同步.命名 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
随机推荐
- vim 实现 go to definition的功能
如:go to definition的功能,使用ctags配置步骤:1.创建vim ~/.vimrc2.配置vim属性 set number filetype plugin indent on ...
- 纯CSS 多图片轮播
今天做东西的时候,遇到一个问题关于图片轮播的问题,以前也接触过(百度 人家的demo改改..),再次遇到这个问题的时候,根据以前的印象找到了demo正信心满满的准备改一下嵌进去,发现 jquery.m ...
- C# 微信支付证书使用
http://wenku.baidu.com/link?url=wt24Gc-2-TbZRoQQ2vRNl5P0pMgp7dIoJMzb_zc1FyiMnBECBDMJ9RTuFCeHl9Lu0ahg ...
- 用Chrome在电脑上模拟微信浏览器
1.先了解安卓微信和Ios微信的UA(User agent:用户代理) 安卓微信UA: mozilla/5.0 (linux; u; android 4.1.2; zh-cn; mi-one plus ...
- 【Mongodb】---关联表查询population
Population MongoDB是非关联数据库.但是有时候我们还是想引用其它的文档.这就是population的用武之地. Population是从其它文档替换文档中的特定路径.我们可以迁移一个单 ...
- spring小例子-springMVC+mybits整合的小例子
这段时间没更博,找房去了... 吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了.. 搬家太 ...
- 一.CSS工作原理
CSS全称层叠样式表,它是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.是能够真正做到网页表现与内容分离的一种样式设计语言,能够对网页 ...
- 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
总结: 1.For-Each循环的缺点:丢掉了索引信息. 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. ...
- Sublime Python 插件配置合集
Python PEP8 Autoformat 插件 这是用来按PEP8自动格式化代码的.可以在包管理器中安装.快捷键 CTRL+SHIFT+R 自动格式化python代码 { "auto_c ...
- UILabel 整理
UILabel 多行文字自动换行 (自动折行) 1.UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(10, 100, 3 ...