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