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

不同进程怎么同步 c语言

在C语言中,进程同步是指多个进程之间协调运行的过程,当多个进程共享资源时,可能会出现竞争条件,导致数据不一致或其他问题,为了解决这个问题,我们需要使用同步机制来确保进程之间的正确执行顺序,本文将详细介绍C语言中的进程同步技术。

1、互斥锁(Mutex)

互斥锁是一种最基本的同步机制,它只允许一个进程在同一时间访问共享资源,当一个进程获得互斥锁时,其他进程必须等待,直到锁被释放,在C语言中,我们可以使用POSIX线程库(pthread)提供的互斥锁函数来实现这一功能。

以下是一个简单的互斥锁示例:

#include <stdio.h>
#include <pthread.h>
int counter = 0; // 共享资源
pthread_mutex_t mutex; // 互斥锁
void *increment(void *arg) {
    for (int i = 0; i < 100000; i++) {
        pthread_mutex_lock(&mutex); // 加锁
        counter++;
        pthread_mutex_unlock(&mutex); // 解锁
    }
    return NULL;
}
int main() {
    pthread_t tid1, tid2;
    pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
    pthread_create(&tid1, NULL, increment, NULL);
    pthread_create(&tid2, NULL, increment, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    printf("Counter: %d
", counter); // 输出结果应为200000
    pthread_mutex_destroy(&mutex); // 销毁互斥锁
    return 0;
}

2、条件变量(Condition Variable)

条件变量是一种更高级的同步机制,它允许一个或多个进程等待某个条件成立,然后才继续执行,当条件不成立时,进程会被阻塞,直到另一个进程通知条件已满足,在C语言中,我们可以使用POSIX线程库(pthread)提供的条件变量函数来实现这一功能。

以下是一个简单的条件变量示例:

#include <stdio.h>
#include <pthread.h>
int counter = 0; // 共享资源
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t cond; // 条件变量
int ready = 0; // 表示计数器是否准备好的标志
void *producer(void *arg) {
    for (int i = 0; i < 100000; i++) {
        pthread_mutex_lock(&mutex); // 加锁
        counter++;
        pthread_mutex_unlock(&mutex); // 解锁
        pthread_cond_signal(&cond); // 通知消费者计数器已增加
    }
    return NULL;
}
void *consumer(void *arg) {
    for (int i = 0; i < 100000; i++) {
        pthread_mutex_lock(&mutex); // 加锁
        while (counter == 0) { // 如果计数器为0,等待条件满足
            pthread_cond_wait(&cond, &mutex); // 等待生产者通知
        }
        ready = 1; // 表示计数器已准备好的标志设置为1
        printf("Counter: %d
", counter); // 输出结果应为递增的整数序列
        ready = 0; // 重置标志位,以便下次循环继续等待计数器增加
        pthread_mutex_unlock(&mutex); // 解锁
    }
    return NULL;
}
int main() {
    pthread_t tid1, tid2;
    pthread_mutex_init(&mutex, NULL); // 初始化互斥锁和条件变量
    pthread_cond_init(&cond, NULL); // 初始化条件变量
    pthread_create(&tid1, NULL, producer, NULL);
    pthread_create(&tid2, NULL, consumer, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_mutex_destroy(&mutex); // 销毁互斥锁和条件变量
    return 0;
}

3、信号量(Semaphore)

信号量是一种用于控制多个进程对共享资源的访问的同步机制,它有一个整数值作为参数,表示可用的资源数量,当一个进程需要访问共享资源时,它会尝试获取信号量,如果信号量的值大于0,进程将获得信号量并继续执行;否则,进程将被阻塞,直到信号量的值大于0,在C语言中,我们可以使用POSIX线程库(pthread)提供的信号量函数来实现这一功能。

以下是一个简单的信号量示例:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h> // 引入信号量头文件
#include <unistd.h> // 引入sleep函数头文件,用于模拟生产者和消费者之间的延迟时间差
#include <sys/time.h> // 引入时间戳函数头文件,用于计算延迟时间差的最大值和最小值
#include <math.h> // 引入数学函数头文件,用于计算平均值和标准差等统计信息
#include <stdlib.h> // 引入随机数生成函数头文件,用于生成随机的延迟时间差值和计数器值范围等参数值
0