C++ 如何在等待前检测pthread条件信号?
我编写了一个简单的pthread示例,使用condition同步两个线程。在某些情况下,在等待之前调用信号,并永远等待线程锁定 有没有办法在等待前检测信号C++ 如何在等待前检测pthread条件信号?,c++,multithreading,pthreads,conditional-statements,C++,Multithreading,Pthreads,Conditional Statements,我编写了一个简单的pthread示例,使用condition同步两个线程。在某些情况下,在等待之前调用信号,并永远等待线程锁定 有没有办法在等待前检测信号 void *Thread1(void *args){ sleep(1); pthread_mutex_lock(&mutex); pthread_cond_wait(&cond,&mutex); pthread_mutex_unlock(&mutex); } void *Thr
void *Thread1(void *args){
sleep(1);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
}
void *Thread2(void *args){
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
停止使用条件变量作为信号机制,因为它们不是。您总是需要一个实际变量来保存数据。当您需要使用数据时,首先检查它的状态,如果状态不是您想要的,则等待条件发生。一旦你醒来,你会再次检查状态
不能将条件变量用作信号。停止将条件变量用作信号机制,因为它们不是。您总是需要一个实际变量来保存数据。当您需要使用数据时,首先检查它的状态,如果状态不是您想要的,则等待条件发生。一旦你醒来,你会再次检查状态
不能将条件变量用作信号。条件变量必须始终与某个共享状态(称为谓词)上的条件配对。一个简单的示例是共享标志变量:
int should_wait = 1;
void *Thread1(void *args)
{
pthread_mutex_lock(&mutex);
while (should_wait)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
void *Thread2(void *args){
pthread_mutex_lock(&mutex);
should_wait = 0;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
条件变量必须始终与某个共享状态(称为谓词)上的条件配对。一个简单的示例是共享标志变量:
int should_wait = 1;
void *Thread1(void *args)
{
pthread_mutex_lock(&mutex);
while (should_wait)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
void *Thread2(void *args){
pthread_mutex_lock(&mutex);
should_wait = 0;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
使用pthread_cond_timedwait避免永远等待?我使用condition处理作业列表,无法计算等待时间,但您的想法很好。我可以保存作业状态并在一段时间内使用pthread_cond_timedwait,这是最新的选择吗?感谢pilcrow的关注,可能是重复的,但不是。@MohsenTi,我同意这个问题乍一看是不同的。然而,我想你要问的是,“我如何正确地使用条件变量暂停一个线程,直到另一个线程说‘OK’,如果事情已经‘OK’,就跳过这个暂停?”这里的主要观点是,您需要一个受互斥体保护并在循环中检查的独立谓词。使用pthread_cond_timedwait避免永远等待?我使用条件处理作业列表,无法计算等待时间,但您的想法很好。我可以保存作业状态并在一段时间内使用pthread_cond_timedwait,这是最新的选择吗?感谢pilcrow的关注,可能是重复的,但不是。@MohsenTi,我同意这个问题乍一看是不同的。然而,我想你要问的是,“我如何正确地使用条件变量暂停一个线程,直到另一个线程说‘OK’,如果事情已经‘OK’,就跳过这个暂停?”这里的主要观点是,你需要一个单独的谓词,由互斥锁保护并在循环中检查。@MohsenTi:cause
pthread_cond_wait()
允许在未发出信号的情况下提前返回(“虚假唤醒”)。@MohsenTi:因为pthread\u cond\u wait()
允许在未发出信号的情况下提前返回(“虚假唤醒”)。