我想学会调用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);
}
}
的逻辑是,我要求输入线程来处理每当输入是可用的数据和信号输出线打印。
你需要一个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_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 ()
也意味着信号的条件变量始终是完全安全的- “额外”的信号不影响程序的正确性,这意味着你可以不喜欢的东西移动信号的码锁定部分之外。