linux POSIX信号量
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信号量的更多相关文章
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- linux Posix 信号量 三 (经典例子)
本文将阐述一下信号量的作用及经典例子,当中包括“<越狱>寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和semSig ...
- 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 ...
- linux c编程:Posix信号量
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...
- linux网络编程之posix信号量与互斥锁
继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...
随机推荐
- 如何在Mac上将视频刻录到DVD / ISO文件
如果您希望将喜爱的视频转换为DVD / Blu-ray光盘以进行物理备份或播放,则Mac版Wondershare UniConverter可以专业地完成任务.今天的教程就是如何在Mac上轻松刻录DVD ...
- read(),readline() 和 readlines() 比较
read(),readline() 和 readlines() 比较 共同点:均可接受一个变量用以限制每次读取的数据量,但通常不使用 区别: read() [即 fileObject().read( ...
- JMS Activemq实战例子demo
上一篇已经讲了JMS的基本概念,这一篇来上手练一练,如果对JMS基本概念还不熟悉,欢迎参靠JMS基本概. 这篇文章所使用的代码已经不是我刚入手时的代码,已经经过我重构过的代码,便于理解,并且加了很多中 ...
- 【IP】DHCP介绍
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...
- UNP学习第六章(二)
一.描述符就绪条件 对于引起select返回套接字“就绪”的条件我们必须讨论得更明确: (1)满足一下塞个条件中的仍和一个时,一个套接字准备好读. a)该套接字接收缓冲区中的数据字节数不大于等于套接字 ...
- vue中使用iview表单验证时this指针问题
需求 使用iview,在提交时对值b进行验证,使其不能大于值a 实现 <Form ref="config" :model="config" :rules= ...
- TextView详解
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all)android: ...
- mock 数据 解决方案
前端工程化之--Mock解决方案 https://www.jianshu.com/p/720b12b5d120 一.为什么要使用mock数据: 1.后端接口数据没有的时候,前端根据接口文档,使用 ...
- ajax请求在参数中添加时间戳
ajax请求在参数中添加时间戳 参考网址
- Example of dynamic programmatic description
- Suppose there are some itineraries in the Itinerary page, and you want to check on all of them. Se ...