在 Linux 下,C++ 可以使用 POSIX 信号量(semaphore)来实现进程间或线程间的同步。POSIX 信号量有两种类型:命名信号量和未命名信号量。这里我们主要讨论未命名信号量的使用。
要在 C++ 中使用信号量,需要包含 <semaphore.h>
头文件。以下是一个简单的示例,展示了如何在 C++ 中使用信号量:
#include <iostream>
#include <semaphore.h>
#include <thread>
#include <vector>
sem_t semaphore;
void worker(int id) {
// 等待信号量
sem_wait(&semaphore);
std::cout << "Worker " << id << " is working." << std::endl;
// 释放信号量
sem_post(&semaphore);
}
int main() {
// 初始化信号量,初始值为 3
sem_init(&semaphore, 0, 3);
// 创建 5 个工作线程
std::vector<std::thread> threads;
for (int i = 0; i < 5; ++i) {
threads.push_back(std::thread(worker, i));
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
// 销毁信号量
sem_destroy(&semaphore);
return 0;
}
在这个示例中,我们创建了一个初始值为 3 的信号量。这意味着最多允许 3 个线程同时执行 worker
函数。我们创建了 5 个工作线程,每个线程在执行 worker
函数时会等待信号量,然后执行任务并释放信号量。
编译并运行这个程序,你会看到最多只有 3 个线程同时执行 worker
函数,其他线程会等待信号量被释放。
注意:在实际应用中,你可能需要根据具体需求调整信号量的初始值和操作。同时,为了避免竞争条件,确保在多个线程中对信号量的操作是原子的。