伟明部落格

Linux C多线程编程--使用条件变量进行线程间的等待和唤醒

--发布于 2024-11-07 21:03:58

下面是一个简单的示例,演示了在Linux C中如何使用条件变量进行线程间的等待和唤醒:

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

pthread_mutex_t mutex;
pthread_cond_t cond;

int flag = 0; // 共享资源

void* thread1(void* arg) {
    pthread_mutex_lock(&mutex);
    printf("Thread 1: Acquired mutex\n");

    if (flag == 0) {
        printf("Thread 1: Waiting for condition variable\n");
        pthread_cond_wait(&cond, &mutex);
    }

    printf("Thread 1: Condition variable signaled, flag = %d\n", flag);
    pthread_mutex_unlock(&mutex);
    printf("Thread 1: Released mutex\n");

    return NULL;
}

void* thread2(void* arg) {
    pthread_mutex_lock(&mutex);
    printf("Thread 2: Acquired mutex\n");

    printf("Thread 2: Modifying flag\n");
    flag = 1;

    printf("Thread 2: Signaling condition variable\n");
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);
    printf("Thread 2: Released mutex\n");

    return NULL;
}

int main() {
    pthread_t t1, t2;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&t1, NULL, thread1, NULL);
    pthread_create(&t2, NULL, thread2, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

在这个例子中,有两个线程:thread1和thread2。它们共享一个标志变量flag,初始值为0。thread1负责等待flag变为非零,而thread2负责修改flag的值并通知thread1。

在thread1中,线程首先获取互斥锁mutex,然后进入了一个循环,检查flag的值是否为0。如果是0,表示条件不满足,thread1调用pthread_cond_wait等待条件变量cond的信号。这个等待操作会自动释放mutex的锁,使得其他线程可以继续访问共享资源。当thread2修改了flag的值,并调用pthread_cond_signal发送条件变量的信号时,thread1被唤醒,重新获取到mutex的锁,然后继续执行后续操作。

在thread2中,线程首先获取互斥锁mutex,然后修改flag的值为1,表示条件满足。接着,它调用pthread_cond_signal函数发送条件变量的信号,通知thread1条件已经满足。最后,它释放mutex的锁。

主函数中创建了两个线程并等待它们执行完毕,然后销毁了互斥锁和条件变量。

这个例子展示了如何使用条件变量实现线程间的等待和唤醒机制,以及互斥锁的配合使用来保护共享资源的访问。

--更新于 2024-11-07 21:07:17