C++ 并发编程实战补充: 信号量

167 阅读1分钟

信号量

概念

信号量 s 表示资源的数量

  • s > 0 空闲资源个数
  • s = 0 没有空闲资源, 没有等待线程
  • s < 0 没有空闲资源, s\left | s \right |被阻塞的线程个数

实现

初始化

信号量初始值表示资源的总个数

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);
        
        ...     // 使用产品
    }
}

扩展

  • 互斥量就是特殊的信号量

  • 条件变量也是特殊的信号量