在并发编程中,同步是一个复杂且重要的问题。除了互斥量和条件变量外,信号量(semaphore)是另一个常用的同步机制。本文将介绍信号量的概念和在C++中的应用。
1. 信号量的概念
信号量是一种同步原语,它主要由一个非负整数值和两个原子操作组成:P(等待)和V(信号)。P操作将检查信号量的值是否大于零,如果是,则将其减一;如果否,则阻塞直到信号量大于零。V操作将信号量加一,如果有任何线程正在等待(阻塞在P操作上),则唤醒其中之一。
2. C++中的信号量
C++标准库并没有直接提供信号量,但我们可以使用std::mutex
和std::condition_variable
来实现一个简单的信号量:
#include <mutex>
#include <condition_variable>
class Semaphore {
public:
Semaphore(int count = 0) : count_(count) {}
void P() {
std::unique_lock<std::mutex> lock(mtx_);
while (count_ == 0) {
cv_.wait(lock);
}
--count_;
}
void V() {
std::unique_lock<std::mutex> lock(mtx_);
++count_;
cv_.notify_one();