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”信号 ...
随机推荐
- hibernate中session的获取使用以及其他注意事项
hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...
- 无线网络(WLAN)常见加密方式介绍
在使用无线路由器配置wifi安全设定的时候经常会遇到各种加密方式,即不懂意思也不知道如何选择.本文将对此做一个简单的介绍. 1.WEP 有线等效协议(Wired Equivalent Privacy, ...
- VMware系统运维(十一)部署虚拟化桌面 Horizon View 5.2 HTML ACCESS安装
如果你希望在浏览器上面能够连接到用户桌面,那么HTML ACCESS是必须安装的,下面开始安装. 1.点击红框文件 2.打开安装向导,点击"下一步" 3.接受协议,点击" ...
- DATASNAP REST WEBSERVICES中间件如何跨平台使用
DATASNAP REST WEBSERVICES中间件如何跨平台使用 准备使用DELPHI开发移动设备开发的朋友对DATASNAP REST中间件不可不了解. DATASNAP REST新型WE ...
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 585 Solved: 175[Subm ...
- Apps Vol53
Android 內購破解 Freedom 軟件 iOS破解軟件IAPFree 能偽造UID IAPFree : 系統已經JB Cydia加入作者的軟件源 Cydia.crazydoraemon.c ...
- Jquery 计算表格某一列的合计
<script type="text/javascript"> function heji(table_id, lie, val_id) { //合计 --xpp // ...
- windows 7 打开控制面板的命令
在开始菜单中键入contrl,回车就进入了控制面板,比较快
- 转载:简单介绍Python中的try和finally和with方法
用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...
- (转)手把手教你如何架设VPN
简介 让远程用户连接Exchange Server的传统解决方案是使用Outlook Web Access.然而,为何不使用虚拟专用网(Virtual Private Network,VPN)让你的远 ...