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