C++ 标准库信号量用法

Posted by KalosAner on March 24, 2025

一、引言

信号量就像一个原子类型的整型全局变量,可以进行增减,但是同时只能有一个线程进行操作。它也适用于生产者消费者模型。它是 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;
    }
}