温馨提示×

Linux进程同步:如何使用信号量实现同步

小樊
62
2025-06-18 19:34:32
栏目: 智能运维

在Linux中,信号量(semaphore)是一种用于进程间同步的机制。它是一个计数器,用于控制多个进程对共享资源的访问。信号量可以用来确保多个进程不会同时访问同一资源,从而避免竞争条件。

以下是使用信号量实现进程同步的基本步骤:

1. 初始化信号量

首先,需要初始化一个信号量。可以使用sem_init函数来初始化信号量。

#include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); 
  • sem: 指向信号量的指针。
  • pshared: 如果为0,则信号量在进程内共享;如果为非0,则信号量在进程间共享。
  • value: 信号量的初始值。

2. 等待信号量(P操作)

在访问共享资源之前,进程需要等待信号量。可以使用sem_wait函数来实现。

int sem_wait(sem_t *sem); 
  • sem: 指向信号量的指针。

如果信号量的值大于0,则将其减1并继续执行。如果信号量的值为0,则进程将被阻塞,直到信号量的值变为大于0。

3. 释放信号量(V操作)

在访问完共享资源之后,进程需要释放信号量。可以使用sem_post函数来实现。

int sem_post(sem_t *sem); 
  • sem: 指向信号量的指针。

该函数将信号量的值加1,并唤醒一个等待该信号量的进程(如果有的话)。

4. 销毁信号量

当不再需要信号量时,应该销毁它。可以使用sem_destroy函数来销毁信号量。

int sem_destroy(sem_t *sem); 
  • sem: 指向信号量的指针。

示例代码

以下是一个简单的示例,展示了如何使用信号量实现两个进程之间的同步。

#include <stdio.h> #include <stdlib.h> #include <semaphore.h> #include <pthread.h> #include <unistd.h> sem_t sem; void* thread_func(void* arg) { int id = *(int*)arg; // 等待信号量 sem_wait(&sem); printf("Thread %d is accessing the shared resource.\n", id); // 模拟访问共享资源 sleep(1); printf("Thread %d is done accessing the shared resource.\n", id); // 释放信号量 sem_post(&sem); return NULL; } int main() { pthread_t threads[2]; int thread_ids[2] = {1, 2}; // 初始化信号量,初始值为1 if (sem_init(&sem, 0, 1) != 0) { perror("sem_init"); exit(EXIT_FAILURE); } // 创建两个线程 for (int i = 0; i < 2; i++) { if (pthread_create(&threads[i], NULL, thread_func, &thread_ids[i]) != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } } // 等待线程结束 for (int i = 0; i < 2; i++) { pthread_join(threads[i], NULL); } // 销毁信号量 sem_destroy(&sem); return 0; } 

在这个示例中,两个线程通过信号量同步访问共享资源。信号量的初始值为1,确保每次只有一个线程可以访问共享资源。

0