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

我正在尝试学习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);

}

}

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

回答:

您需要一个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);

}

}

}

以上是 为什么在pthread_cond_wait之前需要条件检查 的全部内容, 来源链接: utcz.com/qa/412534.html

回到顶部