【问题标题】:How to detect pthread condition singal before wait?如何在等待前检测 pthread 条件信号?
【发布时间】:2016-06-21 04:11:12
【问题描述】:

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

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

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);
}

【问题讨论】:

  • 使用 pthread_cond_timedwait 避免永远等待?
  • 我使用条件来处理作业列表并且无法计算等待时间,但您的想法很好。我可以保存工作状态并在一段时间内使用 pthread_cond_timedwait,这是最新的选择吗?
  • 感谢 pilcrow 的关注,但没有。
  • @MohsenTi,我同意乍一看这个问题看起来不一样。但是,我认为您要问的是,“我如何正确使用条件变量来暂停线程,直到另一个线程说'OK',如果事情已经'OK',则跳过该暂停?”与这里一样,那里的主要见解是,您需要一个受互斥锁保护并在循环中检查的单独谓词。

标签: c++ multithreading pthreads conditional-statements


【解决方案1】:

停止使用条件变量作为信号机制,因为它们不是。您总是需要一个保存数据的实际变量。当你需要使用数据时,你首先检查它的状态,如果状态不是你想要的,你等待条件发生。唤醒后,再次检查状态。

您不能将条件变量用作信号。

【讨论】:

    【解决方案2】:

    条件变量必须始终与某个共享状态的条件配对(称为谓词)。一个简单的例子是共享标志变量:

    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);
    }
    

    【讨论】:

    • @MohsenTi:因为pthread_cond_wait() 被允许提前返回,即使它没有被发出信号(“虚假唤醒”)。
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多