欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > pthread_cond_wait概念和使用案例

pthread_cond_wait概念和使用案例

2024/12/31 7:00:00 来源:https://blog.csdn.net/weixin_42108533/article/details/144794592  浏览:    关键词:pthread_cond_wait概念和使用案例

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_waitpthread_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

运行程序,可以看到生产者和消费者交替生产和消费产品,直到所有的产品都被生产和消费完毕。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com