pthread_cond_wait
是 POSIX 线程(pthread)库中的一个函数,用于线程间的条件同步。它允许线程在某些条件不满足时挂起(阻塞),直到另一个线程发出条件满足的通知。
概念:
pthread_cond_wait
通常与互斥锁(mutex)结合使用,以防止竞态条件和确保条件变量的正确使用。线程在等待某个条件时,会先锁定互斥锁,然后调用 pthread_cond_wait
来等待条件变量变为真。在条件变量变为真之前,线程会阻塞并自动释放互斥锁,这样其他线程可以锁定互斥锁并改变条件。一旦条件变量被信号(signal)或广播(broadcast)通知,等待的线程将重新锁定互斥锁,并从 pthread_cond_wait
返回。
函数原型如下:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
参数说明:
cond
:指向条件变量的指针。mutex
:指向互斥锁的指针。
返回值:- 成功:返回 0。
- 失败:返回错误编号。
使用案例:
以下是一个使用 pthread_cond_wait
和 pthread_cond_signal
的例子,演示了生产者-消费者问题:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define BUFFER_SIZE 5
// 定义互斥锁和条件变量
pthread_mutex_t lock;
pthread_cond_t cond;
// 缓冲区
int buffer = 0;
// 生产者线程函数
void *producer(void *arg) {for (int i = 0; i < 10; i++) {// 锁定互斥锁pthread_mutex_lock(&lock);// 如果缓冲区满了,等待消费者消费while (buffer >= BUFFER_SIZE) {pthread_cond_wait(&cond, &lock);}// 生产一个产品buffer++;printf("Produced: %d\n", buffer);// 通知消费者pthread_cond_signal(&cond);// 解锁互斥锁pthread_mutex_unlock(&lock);// 生产者休息一会儿sleep(1);}return NULL;
}
// 消费者线程函数
void *consumer(void *arg) {for (int i = 0; i < 10; i++) {// 锁定互斥锁pthread_mutex_lock(&lock);// 如果缓冲区为空,等待生产者生产while (buffer <= 0) {pthread_cond_wait(&cond, &lock);}// 消费一个产品buffer--;printf("Consumed: %d\n", buffer);// 通知生产者pthread_cond_signal(&cond);// 解锁互斥锁pthread_mutex_unlock(&lock);// 消费者休息一会儿sleep(1);}return NULL;
}
int main() {pthread_t prod_thread, cons_thread;// 初始化互斥锁和条件变量pthread_mutex_init(&lock, NULL);pthread_cond_init(&cond, NULL);// 创建生产者和消费者线程pthread_create(&prod_thread, NULL, producer, NULL);pthread_create(&cons_thread, NULL, consumer, NULL);// 等待线程结束pthread_join(prod_thread, NULL);pthread_join(cons_thread, NULL);// 销毁互斥锁和条件变量pthread_mutex_destroy(&lock);pthread_cond_destroy(&cond);return 0;
}
在这个例子中:
- 生产者线程在缓冲区满时等待,直到消费者消费了产品并发出信号。
- 消费者线程在缓冲区空时等待,直到生产者生产了产品并发出信号。
pthread_cond_wait
用于等待条件变量变为真,同时释放互斥锁。pthread_cond_signal
用于通知一个等待的线程条件变量可能已经变为真。
编译时需要链接 pthread 库:
gcc -o cond_wait_example cond_wait_example.c -lpthread
运行程序,可以看到生产者和消费者交替生产和消费产品,直到所有的产品都被生产和消费完毕。