在Linux环境下,C++可以使用POSIX信号量(semaphore)来实现进程间或线程间的同步。POSIX信号量有两种类型:命名信号量和未命名信号量。这里我们主要讨论未命名信号量的使用方法。
首先,需要在代码中包含
头文件。然后,可以使用sem_init()
函数初始化信号量,sem_wait()
函数等待信号量,sem_post()
函数释放信号量,以及sem_destroy()
函数销毁信号量。
下面是一个简单的示例,演示了如何在C++中使用信号量:
#include #include #include #include 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 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; }
在这个示例中,我们创建了两个线程,每个线程打印一部分数字。我们使用信号量来确保每次只有一个线程在打印数字,从而避免输出混乱。
注意:在实际应用中,根据需求选择合适的信号量类型(命名或未命名)以及同步机制(如互斥锁、条件变量等)。