linux

C++在Linux下如何使用信号量

小樊
53
2025-05-18 10:45:34
栏目: 编程语言

在 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 函数,其他线程会等待信号量被释放。

注意:在实际应用中,你可能需要根据具体需求调整信号量的初始值和操作。同时,为了避免竞争条件,确保在多个线程中对信号量的操作是原子的。

0
看了该问题的人还看了