信号量
概念
信号量 s 表示资源的数量
- s > 0 空闲资源个数
- s = 0 没有空闲资源, 没有等待线程
- s < 0 没有空闲资源, 为被阻塞的线程个数
实现
初始化
信号量初始值表示资源的总个数
int s = k; // 共有 k 份资源
P 操作
wait()
void P(int &s)
{
s--;
if(s < 0)
block();
}
V 操作
signal()
void V(int &s)
{
s++;
if(s <= 0)
wakeup();
}
应用
互斥
int s = 1;
T:
{
P(s);
...
V(s);
}
同步
顺序: A B
int s = 0;
A:
{
...
V(s);
}
B:
{
P(s);
...
}
生产者消费者
多个生产者线程, 多个消费者线程
初始为空, 大小为 n 的缓冲区
初始化
int mutex = 1;
int empty = n;
int full = 0;
生产者
A:
{
while(true)
{
... // 生产产品
P(empty);
P(mutex);
... // 产品放入缓冲区
V(mutex);
V(full);
}
}
消费者
B:
{
while(true)
{
P(full);
P(mutex);
... // 从缓冲区取出产品
V(mutex);
V(empty);
... // 使用产品
}
}
扩展
-
互斥量就是特殊的信号量
-
条件变量也是特殊的信号量