pthread_cond_wait()
和pthread_cond_signal()
是POSIX线程库中的两个函数,用于线程间的同步。它们通常与互斥锁(mutex)一起使用,以实现条件变量的等待和通知机制。
正确的调用顺序如下:
pthread_cond_wait()
之前,必须先对互斥锁进行加锁。pthread_cond_wait()
使当前线程进入等待状态,并自动释放互斥锁。pthread_cond_signal()
或pthread_cond_broadcast()
来唤醒等待的线程。#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;
void* producer(void* arg) {
pthread_mutex_lock(&mutex);
ready = 1; // 设置条件为真
pthread_cond_signal(&cond); // 通知等待的线程
pthread_mutex_unlock(&mutex);
return NULL;
}
void* consumer(void* arg) {
pthread_mutex_lock(&mutex);
while (ready == 0) {
pthread_cond_wait(&cond, &mutex); // 等待条件成立
}
printf("Condition met!\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
pthread_cond_signal()
:唤醒一个等待的线程。pthread_cond_broadcast()
:唤醒所有等待的线程。原因:线程在调用pthread_cond_wait()
之前未正确加锁,或者在唤醒后未重新加锁。
解决方法:确保每次调用pthread_cond_wait()
前都已加锁,并在唤醒后重新加锁。
原因:线程在没有收到信号的情况下被唤醒。
解决方法:使用循环检查条件,确保条件真正满足后再继续执行。
while (ready == 0) {
pthread_cond_wait(&cond, &mutex);
}
通过以上步骤和注意事项,可以有效使用pthread_cond_wait()
和pthread_cond_signal()
实现线程间的同步。
领取专属 10元无门槛券
手把手带您无忧上云