一、引言
信号量就像一个原子类型的整型全局变量,可以进行增减,但是同时只能有一个线程进行操作。它也适用于生产者消费者模型。它是 C++20 引入的,编译必须使用 G++ 11 以上。
C++ 的信号量不需要手动销毁。
二、信号量
1
2
3
4
5
#include <semaphore>
#define MAX_SEM 2
counting_semaphore<MAX_SEM> sem(0); // MAX_SEM 最大的信号量值
queue<int> goods;
mutex mtx;
生产者:
1
2
3
4
5
6
7
8
9
10
void producer() {
for (int i = 0; i < 100; ++ i) {
int x = i;
{
lock_guard<mutex> lock(mtx);
goods.push(x);
}
sem.release(); // 当信号量的值为 MAX_SEM 阻塞,不为 MAX_SEM 时信号量的值加一
}
}
消费者:
1
2
3
4
5
6
7
8
9
10
11
12
void consumer() {
for (int i = 0; i < 10; ++ i) {
sem.acquire(); // 当信号量的值为 0 时阻塞,不为 0 时值减一
int x;
{
lock_guard<mutex> lock(mtx);
x = goods.front();
goods.pop();
}
cout << x << endl;
}
}