linux

Linux环境下C++如何使用信号量

小樊
70
2025-05-24 12:25:26
栏目: 编程语言

在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;
}

在这个示例中,我们创建了两个线程,每个线程打印一部分数字。我们使用信号量来确保每次只有一个线程在打印数字,从而避免输出混乱。

注意:在实际应用中,根据需求选择合适的信号量类型(命名或未命名)以及同步机制(如互斥锁、条件变量等)。

0
看了该问题的人还看了