POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展。

创建一个新的命名信号量或者使用一个现有信号量

#include <fcntl.h>
#include <sys/stat.h>
#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);
Link with -pthread
返回值:成功指向信号量的指针,出错SEM_FAILED
name:信号灯外部名字
oflag:选择创建或打开一个现有的信号灯
mode:权限位
value:信号灯初始值

当完成信号量操作时,可以调用sem_close函数来释放任何信号量相关的资源

#include <semaphore.h>

int sem_close(sem_t *sem);
返回值:成功0,出错-
Link with -pthread
sem:指向信号量的指针

可以使用sem_unlink函数来销毁一个命名信号量

#include <semaphore.h>

int sem_unlink(const char *name);
返回值:成功0,出错-
Link with -pthread
name:信号灯的外部名字

实现信号量的减1操作

#incldue <semaphore.h>

int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
返回值:成功0,出错-
sem:指向信号灯的指针

还有一个阻塞一段确定的时间来减1操作

#include <semaphore.h>
#include <time.h> int sem_timedwait(sem_t *restrict sem, const struct timespec *abs_timeout);
返回值:成功0,出错-
Link with -pthread
sem:指向信号灯的指针
abs_timeout:绝对时间。超时基于CLOCK_REALTIME时钟的

使信号量值增1

#include <semaphore.h>

int sem_post(sem_t *sem);
返回值:成功0,出错-
Link with -pthread
sem:指向信号灯的指针

创建一个未命名的信号量

#incldue <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
返回值:成功0,出错-
sem:指向信号灯的指针
pshared:表明是否在多个进程中使用信号量,如果是,设置成一个非0值
value:信号量的初始值

对未命名信号量的使用已经完成时,可以丢弃它

#include <semaphore.h>

int sem_destroy(sem_t *sem);
返回值:成功0,出错-
sem:指向信号灯的指针

可以用来检索信号量值

#include <semaphore.h>

int sem_getvalue(sem_t *sem, int *sval);
返回值:成功0,出错-
sem:指向信号灯的指针
sval:指向的整数值将包含信号量值。除非使用额外的同步机制来避免这种竞争,否则sem_getvalue函数只能用于调试

例程1:

建立两个线程,这两个线程各自将自己的一个整型变量i从1递增到100,并通过信号量控制递增的过程,即这两个整型变量的差不能超过5。

 lude <stdio.h>
#include <semaphore.h>
#include <pthread.h> #define MAX 100
sem_t sem1, sem2; void *th_fn1(void *arg)
{
int i;
for(i=;i<MAX;i++)
{
sem_wait(&sem1);
printf("number in thread1 is %d\n", i);
sem_post(&sem2);
}
pthread_exit((void *)"thread1 exit\n");
} void *th_fn2(void *arg)
{
int i;
for(i=;i<MAX;i++)
{
sem_wait(&sem2);
printf("number in thread2 is %d\n", i);
sem_post(&sem1);
}
pthread_exit((void *)"thread2 exit\n");
} int main(int argc, char *argv[])
{
pthread_t tid1, tid2;
void *tret;
if(sem_init(&sem1, , ) == -)
{
perror("sem1 init failed\n");
return -;
}
if(sem_init(&sem2, , ) == -)
{
perror("sem2 init failed\n");
return -;
} pthread_create(&tid1, NULL, th_fn1, NULL);
pthread_create(&tid2, NULL, th_fn2, NULL); pthread_join(tid1, &tret);
pthread_join(tid2, &tret); sem_destroy(&sem1);
sem_destroy(&sem2); return ;
}

thread sem

linux POSIX信号量的更多相关文章

  1. linux POSIX 信号量介绍

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

  2. linux Posix 信号量 一

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

  3. linux Posix 信号量 二

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

  4. linux Posix 信号量 三 (经典例子)

    本文将阐述一下信号量的作用及经典例子,当中包括“<越狱>寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和semSig ...

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

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

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

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

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

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

  8. linux c编程:Posix信号量

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

  9. linux网络编程之posix信号量与互斥锁

    继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...

随机推荐

  1. 【leetcode】925.Long Pressed Name

    题目如下: Your friend is typing his name into a keyboard.  Sometimes, when typing a character c, the key ...

  2. 文本处理工具——sed基础

    一sed介绍 三剑客是grep,sed,awk,功能都很强大. 其中sed是Stream EDitor,流编辑器 行,编辑器的简写,它一次处理一行内容. sed的强大在于可以对文件进行修改,很适合在脚 ...

  3. linux-usb软件系统架构

    1.软件系统架构 USB主控制器,芯片里面自带了得.为了让USB主控制器运行,所有有USB主控制器驱动. USB核心,内核提供好的USB协议之类的.USB设备驱动是针对插到接口的设备去工作的软件. 主 ...

  4. 【Beta阶段】第十一次Scrum Meeting!

    第十一周会议记录 [Beta阶段]第十一次Scrum Meeting! 一.每日任务内容 本次会议为第十一次Scrum Meeting会议~ 本次会议主要探讨了各自进展以及后续要继续开展的工作. 小组 ...

  5. 探索Redis设计与实现14:Redis事务浅析与ACID特性介绍

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. 前端每日实战:81# 视频演示如何用纯 CSS 创作一个变色旋转动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ejZWKL 可交互视频 此视频是可 ...

  7. windows环境下安装pymysql(操作带图)

    在windows环境下安装pymysql,首先要找到python的安装位置,如果在c盘,启动cmd的时候,要获取管理员权限. 具体步骤,一,管理员模式启动cmd.在箭头指定位置,搜索cmd,出现快捷方 ...

  8. 用MyEclipse将java文件转换成UML类图

    用MyEclipse将java文件转换成UML类图 参考: 用MyEclipse将java文件转换成UML类图 - 君临天下的博客 - CSDN博客  http://blog.csdn.net/dan ...

  9. (61)C# 可枚举类型和迭代器

    一.可枚举类型 枚举器-Enumerator  是一个只读且只能在值序列向前移动的游标 枚举器需要实现下列接口之一 System.Collections.IEnumerator System.Coll ...

  10. (转)SQL Server 2012 手动安装帮助文档+排错

    逆天SQL Server 2012装的不要不要的,最后发现...竟然没帮助文档...汗啊!原来它跟vs一样要自己装帮助文档...好吧,官网一下载,妹的...报错...然后就让我们还原这个安装过程以及逆 ...