详解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、付费专栏及课程。

余额充值