一尘不染

为什么在pthread_cond_wait之前需要条件检查

linux

我正在尝试学习pthread_cond_wait的基础知识。在所有用法中,我都可以看到

if(cond is false)
   pthread_cond_wait

要么

while(cond is false)
   pthread_cond_wait

我的问题是,我们只想cond_wait因为条件为假。那我为什么要忍受明确地放置一个if / while循环的痛苦。我可以理解,在不进行任何if /
while检查的情况下,cond_wait我们将直接击中它,根本不会返回。条件检查是仅用于解决此目的,还是具有其他意义。如果它用于解决不必要的条件等待,则进行条件检查并避免cond_wait类似于轮询?我正在这样使用cond_wait。

void* proc_add(void *name){
    struct vars *my_data = (struct vars*)name;
    printf("In thread Addition and my id = %d\n",pthread_self());
    while(1){
    pthread_mutex_lock(&mutexattr);
    while(!my_data->ipt){  // If no input get in
            pthread_cond_wait(&mutexaddr_add,&mutexattr);  // Wait till signalled
            my_data->opt = my_data->a + my_data->b;
            my_data->ipt=1;
            pthread_cond_signal(&mutexaddr_opt);
    }
    pthread_mutex_unlock(&mutexattr);
    if(my_data->end)
            pthread_exit((void *)0);
    }
}

逻辑是,我要求输入线程在有可用输入时处理数据,并向输出线程发出信号以打印数据。


阅读 464

收藏
2020-06-07

共1个答案

一尘不染

您需要一个while循环,因为pthread_cond_wait即使没有达到您等待的条件,被调用的线程也可能会唤醒。这种现象称为“虚假唤醒”。

这不是错误,而是条件变量的实现方式。

也可以在手册页中找到:

可能会发生
pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒。由于从pthread_cond_timedwait()或pthread_cond_wait()返回的值并不暗示此谓词的值,因此
应在返回时重新评估谓词

有关实际代码的更新:

void* proc_add(void *name) 
{
    struct vars *my_data = (struct vars*)name;

    printf("In thread Addition and my id = %d\n",pthread_self());

    while(1) {

        pthread_mutex_lock(&mutexattr);

        while(!my_data->ipt){  // If no input get in
            pthread_cond_wait(&mutexaddr_add,&mutexattr);  // Wait till signalled
        }

        my_data->opt = my_data->a + my_data->b;
        my_data->ipt=1;
        pthread_cond_signal(&mutexaddr_opt);

        pthread_mutex_unlock(&mutexattr);

        if(my_data->end)
            pthread_exit((void *)0);
        }
    }
}
2020-06-07