首页 文章

在不锁定互斥锁的情况下调用pthread_cond_signal

提问于
浏览
75

我在某个地方读到我们应该在调用 pthread_cond_signal 之前锁定 mutex 并在调用后解锁静音:

pthread_cond_signal()例程用于发信号(或唤醒)正在等待条件变量的另一个线程 . 它应该在锁定互斥锁后调用,并且必须解锁互斥锁才能完成pthread_cond_wait()例程 .

我的问题是:是不是可以在不锁定互斥锁的情况下调用 pthread_cond_signalpthread_cond_broadcast 方法?

3 回答

  • 130

    如果未在代码路径中锁定互斥锁以更改条件和信号,则可能会丢失唤醒 . 考虑这对过程:

    Process A:

    pthread_mutex_lock(&mutex);
    while (condition == FALSE)
        pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
    

    Process B (incorrect):

    condition = TRUE;
    pthread_cond_signal(&cond);
    

    然后考虑这种可能的指令交错,其中 conditionFALSE 开始:

    Process A                             Process B
    
    pthread_mutex_lock(&mutex);
    while (condition == FALSE)
    
                                          condition = TRUE;
                                          pthread_cond_signal(&cond);
    
    pthread_cond_wait(&cond, &mutex);
    

    condition 现在是 TRUE ,但是进程A等待条件变量 - 它错过了唤醒信号 . 如果我们改变进程B来锁定互斥锁:

    Process B (correct):

    pthread_mutex_lock(&mutex);
    condition = TRUE;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
    

    ......那么上面就不会发生;唤醒永远不会错过 .

    (请注意,您实际上可以在 pthread_mutex_unlock() 之后移动 pthread_cond_signal() 本身,但这可能会导致线程的最佳调度,并且由于更改条件本身,您必须已锁定此代码路径中的互斥锁) .

  • 4

    根据本手册:

    线程可以调用pthread_cond_broadcast()或pthread_cond_signal()函数,无论它当前是否拥有调用pthread_cond_wait()或pthread_cond_timedwait()的线程在等待期间与条件变量相关联的互斥锁;但是,如果需要可预测的调度行为,则该互斥锁应由调用pthread_cond_broadcast()或pthread_cond_signal()的线程锁定 .

    Dave Butenhof(Programming with POSIX Threads的作者)在comp.programming.threads上解释了可预测调度行为语句的含义,并且可用here .

  • 45

    caf,在您的示例代码中,进程B修改 condition 而不先锁定互斥锁 . 如果进程B在修改期间只是锁定了互斥锁,然后在调用 pthread_cond_signal 之前仍然解锁了互斥锁,那么就没有问题 - 我是否正确?

    我直觉地相信caf的位置是正确的:在不拥有互斥锁的情况下调用 pthread_cond_signal 是一个坏主意 . 但是,咖啡馆的例子并不是支持这一立场的证据;它只是支持弱得多(实际上不言自明)立场的证据,即修改受互斥锁保护的共享状态是一个坏主意,除非你先锁定了这个互斥锁 .

    任何人都可以提供一些示例代码,其中调用 pthread_cond_signal 后跟 pthread_mutex_unlock 会产生正确的行为,但调用 pthread_mutex_unlock 后跟 pthread_cond_signal 会产生不正确的行为吗?

相关问题