温馨提示×

Linux系统中C++如何使用信号量

小樊
52
2025-10-23 09:40:32
栏目: 编程语言

在Linux系统中,C++可以使用POSIX信号量(semaphore)来实现进程间或线程间的同步。POSIX信号量是一种计数器,用于控制多个进程或线程对共享资源的访问。以下是如何在C++中使用POSIX信号量的基本步骤:

  1. 包含头文件:
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
  1. 初始化信号量:
sem_t semaphore;
sem_init(&semaphore, 0, 1); // 第一个参数是信号量的指针,第二个参数是信号量的属性(0表示进程共享,1表示线程共享),第三个参数是初始值
  1. 使用信号量:
sem_wait(&semaphore); // 等待信号量,如果信号量的值大于0,则将其减1并继续执行;如果信号量的值为0,则阻塞等待
// 访问共享资源
sem_post(&semaphore); // 将信号量的值加1,唤醒等待的进程或线程
  1. 销毁信号量:
sem_destroy(&semaphore);

下面是一个简单的示例,演示了如何使用信号量来同步两个线程对共享资源的访问:

#include <semaphore.h>
#include <pthread.h>
#include <iostream>

sem_t semaphore;
int shared_resource = 0;

void* thread_func(void* arg) {
    for (int i = 0; i < 100000; ++i) {
        sem_wait(&semaphore);
        ++shared_resource;
        sem_post(&semaphore);
    }
    return nullptr;
}

int main() {
    sem_init(&semaphore, 0, 1);

    pthread_t thread1, thread2;
    pthread_create(&thread1, nullptr, thread_func, nullptr);
    pthread_create(&thread2, nullptr, thread_func, nullptr);

    pthread_join(thread1, nullptr);
    pthread_join(thread2, nullptr);

    std::cout << "Shared resource value: " << shared_resource << std::endl;

    sem_destroy(&semaphore);
    return 0;
}

在这个示例中,我们创建了两个线程,它们都访问共享资源shared_resource。通过使用信号量,我们确保了在任何时候只有一个线程可以访问共享资源。最后,我们销毁信号量并输出共享资源的值。

0