为什么在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