在Linux系统中,C++可以使用POSIX信号量(semaphore)来实现进程间或线程间的同步。POSIX信号量是一种计数器,用于控制多个进程或线程对共享资源的访问。以下是如何在C++中使用POSIX信号量的基本步骤:
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
sem_t semaphore;
sem_init(&semaphore, 0, 1); // 第一个参数是信号量的指针,第二个参数是信号量的属性(0表示进程共享,1表示线程共享),第三个参数是初始值
sem_wait(&semaphore); // 等待信号量,如果信号量的值大于0,则将其减1并继续执行;如果信号量的值为0,则阻塞等待
// 访问共享资源
sem_post(&semaphore); // 将信号量的值加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。通过使用信号量,我们确保了在任何时候只有一个线程可以访问共享资源。最后,我们销毁信号量并输出共享资源的值。