判断sem信号量为零_多线程信号量如何使用

先上一张程序员喜欢的格子衫图片。

6b921b017dd64b47b1213742a11d41f8.png

利用"二进制信号量"(0和1)完成"控制线程顺序"为中心的同步方法。

#include int sem_init(sem_t *sem, int pshared, unsigned value);int sem_destory(sem_t *sem);创建及销毁的方法#include int sem_post(sem_t *sem);int sem_wait(sem_t *sem);

调用 sem_init 函数时,操作系统将创建信息量对象,对象记录着“信号量值”整数。

调用 sem_post函数时信号量值增1, 调用sem_wait函数时信号量值减1。
当信号量为0时调用sem_wait函数时,调用线程将进入阻塞状态。

等到其他线程调用sem_post函数信号量将变为1后,当前阻塞线程会跳出阻塞状态。
通过这样的操作完成临界点的操作。

sem_init(&sem_one, 0, 0);sem_init(&sem_two, 0, 1);// 线程1 函数void t1 () {sem_wait(&sem2); // 信号量0 阻塞后执行t2函数,t2执行完信号量等于1,开始执行t1函数//临界开始....//临界结束sem_post(&sem1); //信号量1 跳出阻塞}void t2(){//线程2sem_wait(&sem1); // 信号量0 阻塞//临界开始....//信号量1 跳出阻塞}//临界结束sem_post(&sem2);

当执行完t1函数后sem1信号量等于0,sem2信号量等于1。

t1函数在sem_wait开始阻塞,会先执行 t2函数。

执行完t2函数 sem2的信号量等于0, sem1的信息号等于1 t2开始阻塞。

等待t1执行后, sem1信号量+1后跳出阻塞。

如此实现两个线程交替执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值