gpt4 book ai didi

c++ - 协助对 pthread_cond_wait() 的错误理解

转载 作者:行者123 更新时间:2023-11-27 22:56:28 24 4
gpt4 key购买 nike

我显然对条件变量及其使用方法的理解存在缺陷。我的意图是拥有一个生产者和多个消费者线程,但我可以用一个生产者和一个消费者来证明我的问题。

有一个名为 work 的共享变量,它受互斥锁和条件变量的保护。生产者设置 work 变量并发出准备就绪的信号,但消费者线程永远无法运行?

如果程序正常运行,它应该打印this line never get's printed,但我得到的是consumer never did work...giving up。任何帮助将不胜感激

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int work = 0;

void* consumer(void* ptr) {
pthread_mutex_lock(&mutex);
while(1) {
pthread_cond_wait(&cond, &mutex);
if (work == 0)
continue;
printf("this line never get's printed\n");
work = 0;
}
return NULL;
}

int main() {
pthread_t thr;
pthread_create(&thr, NULL, consumer, NULL);
sleep(1); /* give consumer moment to lock mutex */

for(int ndx=0; ndx < 50; ndx++) {
pthread_mutex_lock(&mutex);
if (work == 1) {
printf("consumer never did work...giving up\n");
return -1;
}
work = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
return 0;
}

编译:

$ g++ -pthread simple.cpp -o simple

在 Debian 7.9 上运行(也在 CentOS 6.7 上重现)

$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.13

$ g++ --version
gcc version 4.7.2 (Debian 4.7.2-5)

最佳答案

您的问题是,尽管您的消费者线程在继续之前等待生产者生产,但生产者不会同样等待消费者消费。仅仅因为生产者调用 pthread_cond_signal() 并不意味着等待该条件变量的线程将被立即调度,特别是因为生产者线程在调用时锁定了关联的互斥体。消费者在锁定互斥锁之前无法恢复,完全有可能的是,尽管生产者线程解锁了它,但它也会循环循环并在消费者继续之前再次锁定它。

您可以使用相同的条件变量或与相同的互斥量关联的另一个条件变量,以允许消费者向生产者发出信号,表明可以继续进行。

关于c++ - 协助对 pthread_cond_wait() 的错误理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com