为什么我们需要调用pthread_cond_wait前健康检查(Why do we need a c

2019-08-02 01:47发布

我想学会调用pthread_cond_wait的基础知识。 在所有的用法,我看到无论是

if(cond is false)
   pthread_cond_wait

要么

while(cond is false)
   pthread_cond_wait

我的问题是,我们希望不仅是因为条件为假cond_wait。 那么我为什么要采取的明确把一个如果/ 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);
    }
}

的逻辑是,我要求输入线程来处理每当输入是可用的数据和信号输出线打印。

Answer 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);
        }
    }
}


Answer 2:

因为等待条件变量的信号不排队之前,必须先测试互斥下的条件(条件变量都没有信号灯)。 也就是说,如果一个线程调用pthread_cond_signal()时,没有线程被阻塞在pthread_cond_wait()在该条件变量,那么信号不执行任何操作。

这意味着,如果你有一个线程设置的条件:

pthread_mutex_lock(&m);
cond = true;
pthread_cond_signal(&c);
pthread_mutex_unlock(&m);

然后另一个线程等待无条件:

pthread_mutex_lock(&m);
pthread_cond_wait(&c, &m);
/* cond now true */

第二个线程将永远阻塞。 这是通过具有用于条件第二线程检查避免:

pthread_mutex_lock(&m);
if (!cond)
    pthread_cond_wait(&c, &m);
/* cond now true */

由于cond仅与互斥改性m保持,这意味着第二线程等待当且仅当cond是假的。

一个原因while ()循环是可靠的代码,而不是使用if ()是因为pthread_cond_wait()并不能保证它不会醒来不合逻辑。 使用while ()也意味着信号的条件变量始终是完全安全的- “额外”的信号不影响程序的正确性,这意味着你可以不喜欢的东西移动信号的码锁定部分之外。



文章来源: Why do we need a condition check before pthread_cond_wait