linux

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

小樊
52
2025-10-07 10:24:34
栏目: 智能运维

在Linux中,信号量(semaphore)是一种用于进程间同步的机制,它可以帮助多个进程协调对共享资源的访问。信号量通常用于防止竞态条件(race condition),确保多个进程不会同时修改同一资源。

以下是使用信号量的基本步骤:

1. 初始化信号量

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

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

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

使用sem_wait函数来等待信号量。如果信号量的值大于0,则将其减1并继续执行;如果信号量的值为0,则进程将被阻塞,直到信号量的值变为大于0。

int sem_wait(sem_t *sem);

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

使用sem_post函数来释放信号量。这将信号量的值加1,并唤醒一个等待该信号量的进程(如果有)。

int sem_post(sem_t *sem);

4. 销毁信号量

使用sem_destroy函数来销毁信号量。

int sem_destroy(sem_t *sem);

示例代码

以下是一个简单的示例,展示了如何使用信号量来同步两个进程对共享资源的访问。

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.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
看了该问题的人还看了