当前位置:首页 > 行业动态 > 正文

Linux如何实现进程间同步

Linux进程间同步有多种方式,信号量、互斥量、读写锁等等。互斥量可以用于在线程间同步,也可以用于进程间的同步。为了达到这一目的,可以在pthread_mutex_init初始化之前,修改其属性为进程间共享。互斥量的属性修改函数主要有以下几个: pthread_mutexattr_t mattr 类型:用于定义互斥量的属性 pthread_mutexattr_init函数:初始化一个mutex属性对象 pthread_mutexattr_destroy函数:销毁mutex属性对象 (而非销毁锁)

Linux如何实现进程间同步

在Linux系统中,进程间同步是一种常见的需求,它可以确保多个进程按照预期的顺序执行,避免数据竞争和死锁等问题,本文将介绍Linux中几种常见的进程间同步机制,包括信号量、互斥锁、条件变量和读写锁。

信号量

信号量(semaphore)是一种计数器,用于管理对共享资源的访问,它有两个主要操作:P操作(等待)和V操作(释放),当一个进程需要获取资源时,它会执行P操作,如果信号量的值大于0,那么信号量的值减1,进程继续执行;否则,进程阻塞,直到信号量的值变为正数,当一个进程完成对资源的使用后,它会执行V操作,将信号量的值加1。

要使用信号量,首先需要创建一个信号量对象,在C语言中,可以使用sem_init()函数初始化一个信号量,然后使用sem_wait()和sem_post()函数进行P操作和V操作,以下是一个简单的示例:

include <stdio.h>
include <pthread.h>
include <semaphore.h>
sem_t sem;
void *func(void *arg) {
    sem_wait(&sem);
    printf("线程%d获取到资源
", (int)arg);
    sleep(1);
    printf("线程%d释放资源
", (int)arg);
    sem_post(&sem);
    return NULL;
}
int main() {
    pthread_t thread1, thread2;
    sem_init(&sem, 0, 1);
    pthread_create(&thread1, NULL, func, (void *)1);
    pthread_create(&thread2, NULL, func, (void *)2);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    sem_destroy(&sem);
    return 0;
}

互斥锁

互斥锁(mutex)是一种更细粒度的同步机制,它可以保护一段代码或数据区域不被多个进程同时访问,当一个进程需要访问共享资源时,它会尝试获取互斥锁,如果互斥锁已被其他进程锁定,那么当前进程会被阻塞,直到互斥锁被释放,一旦互斥锁被释放,当前进程就可以获取锁并访问共享资源,当进程完成对共享资源的使用后,它应该释放互斥锁,以便其他进程可以获取锁。

要使用互斥锁,首先需要定义一个互斥锁变量,在C语言中,可以使用pthread_mutex_t类型的变量作为互斥锁,然后使用pthread_mutex_init()函数初始化互斥锁,使用pthread_mutex_lock()和pthread_mutex_unlock()函数进行加锁和解锁操作,以下是一个简单的示例:

include <stdio.h>
include <pthread.h>
include <time.h>
pthread_mutex_t lock;
int data = 0;
void *func(void *arg) {
    int id = (int)arg;
    for (int i = 0; i < 100000; i++) {
        pthread_mutex_lock(&lock);
        data++;
        printf("线程%d修改了data的值为%d
", id, data);
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}
int main() {
    pthread_t thread1, thread2;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&thread1, NULL, func, (void *)1);
    pthread_create(&thread2, NULL, func, (void *)2);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_mutex_destroy(&lock);
    return 0;
}

条件变量

条件变量(condition variable)是一种更高级的同步机制,它可以让一个进程在特定条件下唤醒另一个进程,条件变量通常与互斥锁一起使用,以防止死锁,当一个进程需要等待某个条件满足时,它会执行pthread_cond_wait()函数,该函数会自动释放互斥锁并使当前进程进入阻塞状态,当条件满足时,另一个进程可以执行pthread_cond_signal()或pthread_cond_broadcast()函数来唤醒等待的进程,被唤醒的进程会重新获取互斥锁并继续执行,当进程完成对共享资源的使用后,它应该调用pthread_cond_destroy()函数销毁条件变量,以下是一个简单的示例:

include <stdio.h>
include <pthread.h>
include <unistd.h>
include <time.h>
pthread_cond_t cond;
int data = 0;
bool ready = false;
void *func(void *arg) {
    int id = (int)arg;
    while (!ready) {
        pthread_cond_wait(&cond, &mutex); // 注意这里传入的是互斥锁指针而不是条件变量本身的指针!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0