一、信号量是什么?
为什么需要用信号量?在POSIX线程库(二)线程同步轮询技术——一种笨笨方法 简单的变量+延迟的方法是一种非常不聪明的方法,主要原因是普通变量不能保证原子性,同时对标志的操作可能导致预料外的效果。荷兰科学家Dijkstra提出信号量的概念,它是一种特殊的变量,可以被递增递减,当两个或以上线程对这个信号量进行改变,由系统按顺序完成线程的请求。信号量常用来保护一段代码,保证一次只能被一个线程执行。
二、信号量API使用一个信号量,其基本步骤是:
- 声明一个信号量
- 初始化一个信号量
- 线程1使用sem_post增加信号量
- 线程2中调用sem_wait条件阻塞完成信号同步
- 销毁信号量
头文件#include
sem_t bin_sem;
初始化
int sem_init(sem_t *sem,int pshared,unsigned int value);
sem_t * sem
声明的信号量地址int pshared
一般将其设置为0,表示这是一个局部信号量(单进程共享),迄今为止,Linux尚未支持多个进程共享(传递会失败)。unsigned int value
信号量初值- 返回值,0表示相安无事,反之创建失败
int sem_post(sem_t * sem);
int sem_wait(sem_t * sem);
sem_wait
和sem_post
都接受一个信号量地址,和初始化一样,成功0,失败!0。值得注意的是,sem_wait
可能阻塞当前进程,阻塞的条件是,递减后为负数,也就是信号量为0,要想继续执行,需要调用sem_post
完成信号量递增。
int sem_destory(sem_t * sem);
好吧!和所有信号量相关的API都需要传入信号量地址。当一些线程正在等待状态,返回非0,成功销毁则返回0。
三、Demo time!!!#include
#include
#include
#include
sem_t t;
using namespace std;
void *thfun1(void *)
{
sem_post(&t);
for(int i=0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?