C++ 如何在等待前检测pthread条件信号?

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

我编写了一个简单的pthread示例,使用condition同步两个线程。在某些情况下,在等待之前调用信号,并永远等待线程锁定

有没有办法在等待前检测信号

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()
允许在未发出信号的情况下提前返回(“虚假唤醒”)。