欢迎光临散文网 会员登陆 & 注册

互斥体(Mutex)和条件变量(Condition Variable)

2023-05-12 05:36 作者:机器朗读  | 我要投稿

互斥体(Mutex)和条件变量(Condition Variable)都是C语言中多线程编程中常用的同步机制,它们的主要差异在于互斥体用于保护临界区(Critical Section)中的共享数据,而条件变量用于在线程之间进行通信和同步。

互斥体是一种线程同步的机制,用于保护临界区中的共享资源,避免多个线程同时对共享资源进行读写,导致数据不一致或者竞态条件的问题。互斥体通常是一个锁,它可以保证同一时刻只有一个线程可以进入临界区,其他线程必须等待当前线程释放锁之后才能进入。

下面是一个简单的使用互斥体实现线程同步的例子代码:

#include <stdio.h>
#include <pthread.h>

// 定义全局变量和互斥体
int sum = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 线程函数,将1~100的整数相加
void* thread_func(void* arg) {
    int i;
    for (i = 1; i <= 100; i++) {
        // 加锁
        pthread_mutex_lock(&mutex);
        sum += i;
        // 解锁
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}

int main() {
    // 定义线程ID和属性
    pthread_t thread;
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    // 创建线程
    pthread_create(&thread, &attr, thread_func, NULL);

    // 主线程将1~100的整数相加
    int i;
    for (i = 1; i <= 100; i++) {
        // 加锁
        pthread_mutex_lock(&mutex);
        sum += i;
        // 解锁
        pthread_mutex_unlock(&mutex);
    }

    // 等待子线程结束
    pthread_join(thread, NULL);

    // 输出结果
    printf("sum = %d\n", sum);

    return 0;
}

在上面的例子中,我们使用了pthread_mutex_lock和pthread_mutex_unlock函数来加锁和解锁互斥体,以保证线程之间的同步。

条件变量是一种线程间通信的机制,用于在线程之间传递信息和同步,它通常用于等待某个特定事件的发生,例如,等待一个资源变得可用或者等待一个条件满足。条件变量需要和互斥体一起使用,以保证线程之间的同步和互斥。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
int count = 0;

void* thread_func(void* arg) {
    // 加锁
    pthread_mutex_lock(&mutex);

    // 等待条件变量
    while (count == 0) {
        pthread_cond_wait(&cond, &mutex);
    }

    // 执行任务
    printf("thread_func: count = %d\n", count);

    // 解锁
    pthread_mutex_unlock(&mutex);

    pthread_exit(NULL);
}

int main() {
    // 定义线程ID和属性
    pthread_t thread;
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    // 初始化互斥体和条件变量
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    // 创建线程
    pthread_create(&thread, &attr, thread_func, NULL);

    // 主线程增加计数器
    pthread_mutex_lock(&mutex);
    count++;
    printf("main: count = %d\n", count);

    // 发送信号给条件变量
    pthread_cond_signal(&cond);

    // 解锁
    pthread_mutex_unlock(&mutex);

    // 等待子线程结束
    pthread_join(thread, NULL);

    // 销毁互斥体和条件变量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

在上面的例子中,我们使用了pthread_cond_wait函数等待条件变量,当计数器count被主线程增加到1时,主线程发送信号给条件变量,使得等待该条件变量的子线程可以继续执行。同时,我们使用了互斥体保护共享数据count,以避免竞态条件的出现。

总的来说,使用条件变量可以实现线程之间的同步和通信,通过pthread_cond_wait和pthread_cond_signal函数的配合使用,可以在线程之间传递信息,使得一个线程等待另一个线程满足某个条件后再继续执行。


互斥体(Mutex)和条件变量(Condition Variable)的评论 (共 条)

分享到微博请遵守国家法律