在Linux环境下,C++可以使用POSIX信号量(semaphore)来实现进程间或线程间的同步。POSIX信号量有两种类型:命名信号量和未命名信号量。这里我们主要讨论未命名信号量的使用方法。
首先,需要在代码中包含<semaphore.h>
头文件。然后,可以使用sem_init()
函数初始化信号量,sem_wait()
函数等待信号量,sem_post()
函数释放信号量,以及sem_destroy()
函数销毁信号量。
下面是一个简单的示例,演示了如何在C++中使用信号量:
#include <iostream>
#include <semaphore.h>
#include <thread>
#include <vector>
sem_t semaphore;
void print_numbers(int start, int end) {
for (int i = start; i <= end; ++i) {
sem_wait(&semaphore); // 等待信号量
std::cout<< i << std::endl;
sem_post(&semaphore); // 释放信号量
}
}
int main() {
const int num_threads = 2;
const int numbers_per_thread = 10;
std::vector<std::thread> threads;
// 初始化信号量,初始值为1
sem_init(&semaphore, 0, 1);
// 创建线程
for (int i = 0; i < num_threads; ++i) {
int start = i * numbers_per_thread + 1;
int end = (i + 1) * numbers_per_thread;
threads.push_back(std::thread(print_numbers, start, end));
}
// 等待线程结束
for (auto& t : threads) {
t.join();
}
// 销毁信号量
sem_destroy(&semaphore);
return 0;
}
在这个示例中,我们创建了两个线程,每个线程打印一部分数字。我们使用信号量来确保每次只有一个线程在打印数字,从而避免输出混乱。
注意:在实际应用中,根据需求选择合适的信号量类型(命名或未命名)以及同步机制(如互斥锁、条件变量等)。