0.总览
1.背景
2.信号量
3.信号量的使用
3.1 信号量的PV操作
3.2 信号量的类型和使用场景
3.3 用二进制信号量实现互斥
3.4 用二进制信号量实现简单同步
初值要设置成0;
比如说有两个线程,线程A和线程B必须要等到线程B执行到某个语义之后才能执行.
如何确保这一点呢?
我们可以使用信号量.
首先我们设置condition这个信号量的初值设置成0;
线程A执行P操作之后变成-1,线程A阻塞,一直到等到线程B在某个特定的地方执行到V操作之后
(确保执行V操作之前的那些操作都执行完毕了)才可能将线程A唤醒.线程A才能继续往下执行.
这样就实现了同步.
3.5 用计数信号量实现较复杂同步
3.5.1 案例的需求与一些前置条件
简单的二进制信号量可能实现不了较复杂的同步需求,于是我们采用条件同步的机制,
这个是用计数信号量来实现这个功能的.
比如说我们现在有buffer,有生产者线程会不停地往buffer里面写东西,同时消费者线程
会从buffer里面去数据,这种情况下消费者和生产者就需要用到同步互斥这两种机制的操
作过程.在这个过程这我们需要知道的前置条件:
(1)buffer是有限的;
(2)生产者往buffer里面写数据的时候,消费者不能够做操作,但是可以有多个生产者都往
buffer中写数据,这一点和我们说lock的时候是不一样的,刚刚说lock的时候是指允许
一个生产者向buffer里面写数据,现在我们可以有多个生产者向里面buffer里面写数据,
同理我们也可以有多个消费者.生产者里有多少个线程取决于我们的信号量的初值.
(3)缓冲区为空,消费者必须等待生产者;
(4)缓冲区满了,生产者必须等待消费者.
老师的PPT中的“任何一个事件只能有一个线程操作缓冲区”不是和单线程一样了吗?
多个生产者是什么意思?多个生产者是多个线程的意思吗?
3.5.2 实现的简单代码
V操作无影响
P操作有影响
4.信号量的实现
5.