sem_init函数用法
来源:互联网 发布:淘宝模版导航页图片 编辑:程序博客网 时间:2024/06/04 17:52
sem_init函数
sem_init函数是Posix信号量操作中的函数。sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。如果 pshared 的值为 0,那么信号量将被进程内的线程共享,并且应该放置在这个进程的所有线程都可见的地址上(如全局变量,或者堆上动态分配的变量)。
如果 pshared 是非零值,那么信号量将在进程之间共享,并且应该定位共享内存区域(见 shm_open(3)、mmap(2) 和 shmget(2))。因为通过 fork(2) 创建的孩子继承其父亲的内存映射,因此它也可以见到这个信号量。所有可以访问共享内存区域的进程都可以用 sem_post(3)、sem_wait(3) 等等操作信号量。初始化一个已经初始的信号量其结果未定义。
返回值
sem_init() 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。用下面一组函数(系统调用)来实现。
int sem_init(sem_t *sem,int pshared,unsigned int value); int sem_destroy(sem_t *sem); int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_post(sem_t *sem); int sem_getvalue(sem_t *sem);
具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
第一个参数:信号量名
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
- sem_init函数用法
- sem_init() 函数
- sem_init函数
- sem_init()函数
- sem_init
- sem_init
- sem_init
- 内存信号量sem_init函数解析
- 多线程信号量 sem_init 系列函数
- sem_init,sem_post,sem_wait 信号量的用法解释
- sem_init,sem_post,sem_wait 信号量的用法解释
- sem_init,sem_post,sem_wait 信号量的用法解释
- 信号量的用法和解释,sem_init,sem_wait
- 信号量sem_init
- 多线程sem_init
- sem_init sem_post sem_wait
- sem_init on OS X
- 信号量sem_init,sem_wait,sem_post
- 基于netty实现的socks5代理协议
- DefaultListableBeanFactory 类继承分析二
- linux下显示所有符号的命令
- Win7 64位下安装MATLAB7.0后,无法正常运行的解决办法
- 【堂二皇之】微信小程序,是风口吗?
- sem_init函数用法
- typeScript
- poj_3301 Texas Trip(三分解单峰函数)
- [Gradle中文教程系列]-跟我学Gradle-附录-2.Gradle的日志级别
- Android 利用 <activity-alias> 动态改变 App 桌面图标
- SnowFlake 分布式ID生成Java实现
- android_57_service_通过服务器启动屏幕状态接收者
- Android 开发,测试环境换app icon ,在小米手机上无效。
- IDEA控制台输出中文乱码