详解sem信号量在C++并发编程之线程同步中的应用

sem_t

信号量是一种变量,其访问是原子操作(不可中断的一个或者一系列操作, 运行期间不会有任何的上下文切换)的,其头文件为:
#include <semaphore.h>
其主要作用如下:
1、等待信号量,当信号量是0的时候,程序阻塞等待。可以调用相关操作,使信号量加1,当信号量 > 0 的时候,程序就可以继续运行了。
sem_wait(&sem);
2、发送信号量,其作用是让信号量的值+1。实现线程的同步控制。
sem_post(&sem);

常见的函数

  • sem_init()
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);

作用:对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前进程的局部信号量;否则,其它进程就能够共享这个信号量。只对不让进程共享的信号量感兴趣。Linux线程一般不支持进程间共享信号量,pshared传递一个非零将会使函数返回ENOSYS错误。

  • sem_post(sem_t *sem);
    作用:给信号量的值加上一个“1”,(原子操作,同时对同一个信号量做加“1”操作的两个线程是不会冲突的)

  • sem_wait(sem_t *sem);
    作用:从信号量的值减去一个“1”(原子操作),但它会先等待该信号量为一个非零值才开始做减法。

  • sem_getvalue(sem_t *sem,int *valp)
    作用:获取sem的值,并保存在valp中。

  • sem_destory(sem_t *sem)
    作用:用完信号量对它进行清理。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值