作用

信号量的值为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 信号量的更多相关文章

  1. 第10章 Posix 信号量

    10.1 概述 10.1.1 信号量类型 Posix有名信号量:使用Posix IPC名字,可用于进程或线程间同步: Posix基于内存的信号量:也叫做无名信号量,存放在共享内存中,可用于进程或线程间 ...

  2. 进程间通信之POSIX信号量

    POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...

  3. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  4. Linux进程同步之POSIX信号量

    POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...

  5. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

  6. POSIX信号量

    DESCRIPTION POSIX 信号量允许进程间和线程间同步他们的操作. 一个信号量是一个整型(integer),其值不能小于0. 信号量允许2中操作:给信号量的值加1(sem_post); 给信 ...

  7. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  8. posix信号量与互斥锁

    1.简介 POSIX信号量是一个sem_t 类型的变量,但POSIX 有两种信号量的实现机制:无名信号量和命名信号量.无名信号量可以用在共享内存的情况下, 比如实现进程中各个线程之间的互斥和同步.命名 ...

  9. linux Posix 信号量 二

    一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共 ...

  10. linux Posix 信号量 一

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...

随机推荐

  1. 重构13-Extract Method Object(提取方法对象)

    重构来自于Martin Fowler的重构目录.你可以在这里找到包含简介的原始文章.  在我看来,这是一个比较罕见的重构,但有时却终能派上用场.当你尝试进行提取方法的重构时,需要引入大量的方法.在一个 ...

  2. 【CSS】class和id命名规则

    说明,本篇内容为书籍<高流量网站CSS开发技术>的学习总结,文字出自书本 书不错,推荐阅读学习 也可参阅网上的博文 原载:彬Go链接:http://blog.bingo929.com/cs ...

  3. nginx lua mysql redis设置

    最近公司网站改版,程序和数据库全部用新版,旧版的数据要导入,旧网站的30万条数据url要全部重定向到新版网站,正好前段时间在学习nginx+lua+mysql+memcache(redis),找资料真 ...

  4. SLR,语法分析表的构建

    太累了,感觉不会再爱了.执行了跟编译原理上的一模一样的例子,输出了正确结果 #include <stdio.h> #include <malloc.h> #include &l ...

  5. Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed

    最近在用Python开发自己的博客,需要用到Python生成验证码,当然肯定要用到Python的图形处理库PIL,因为我用的是windows. 所以在安装好pil之后就开始写,就按照题目所说出现了Th ...

  6. 【BUG】---ng-show/ng-hide修改成功但没有效果

    问题:点击搜索,隐藏tab,出现搜索结果列表,调试也成功修改了分别元素的ng-hide就是没有效果 我的错误: <div ng-hide="{{isShow}}" class ...

  7. JsonHelper类(序列化和反序列化辅助类)

       1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Web; ...

  8. C# HttpWebRequest类

    HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...

  9. OC10_代理反向传值

    // // ProtectedDelegate.h // OC10_代理反向传值 // // Created by zhangxueming on 15/6/24. // Copyright (c) ...

  10. CSS学习备忘

    CSS样式控制行间距,用line-height 测试一下: <div style="line-height:6px"> 111<br> 222<br& ...