信号量
2020-12-02 本文已影响0人
StevenHD
线程中的信号量
- 有名信号量:进程通信
- 无名信号量:线程通信
- 初始化:调用
sem_init()
就可以创建成功,value=1
相当于互斥锁,value > 1
可以表示资源- 先
sem_wait()
:-1操作,如果信号量为0就会阻塞
sem_trywait()
则是非阻塞,出错了errno会设置为EAGAIN- sem_post():释放,给信号量+1
- 3个线程A, B, C,实现A先执行一段代码,然后B执行一段代码,最后C执行一段代码
需要
3个信号量
A执行的时候让B和C都等待,如何等待呢?B和C线程初始化信号量为0,就会处在等待
- A执行完后给B的信号量+1,从而B就唤醒,执行完B后给C的信号量+1,从而C被唤醒
- 如何实现循环执行呢?给C那里也添加一个A的信号量即可,初始的时候让A的信号量为1就可以了——
除此之外,信号量可以当作资源的个数
使用——
进程中的信号量
-
信号量
的值为1相当于是互斥锁
-
sem_wait()
会阻塞等待 -
sem_trywait()
不会阻塞当前线程,如果没有获取到信号量
,会返回一个EAGAIN
。
1.1 线程交替运行
-
sem = 0
意味着资源为0 - 线程的
入口函数
一般是函数指针
的形式 -
主线程
中使用join
是让主线程等待子线程
- 信号量的第一种用法——互斥锁,第二种用法——让线程交替运行
三个线程A,B,C,还有对应的3个信号量,除了第一个初值是1以外,其他2个初值都是0。
图示代码1
图示代码2
图解,使用semphore进行排队
线程A, B, C交替执行
1.2 信号量作为资源个数的使用
消费者——生产者模型
- 仓库中有5个资源
- 商品有0个资源
- 对于资源数组value,如果有多个生产者和多个消费者,那么就需要给value数组的索引加上
互斥锁
来保护静态变量