c - pthread_cond_wait 无限期地阻塞(休眠)直到 pthread_cond_signal 被 C 中的另一个线程调用?

标签 c pthreads signals systems-programming

如果一个线程:A被阻塞在pthread_cond_wait等待一个条件, 我们的线程 A 会无限期地休眠,等待另一个线程调用 pthread_cond_signal 吗? 或者,即使条件以某种方式变为真(工作负载 > MAXLOAD),它也会被唤醒,而无需使用 pthread_cond_wait 发出信号。

线程 A:

while(1) {
    pthread_mutex_lock( &recoveryMutex );  
    while( workload < MAXLOAD ) {                               
        pthread_cond_wait(&recoveryCond, &recoveryMutex );      
    }
    /* Recovery Code */
    /* Recovery Code */
    /* Recovery Code */        
    pthread_mutex_unlock(&recoveryMutex);
}

最佳答案

简而言之,是的,它会无限期地阻塞/休眠,直到您发出信号。

pthread_cond_wait 可能出于任何原因“虚假地”唤醒(这通常与条件变为真没有任何关系;机械上没有合理的方式可以实现这种关系是),但在 pthread_cond_signalpthread_cond_broadcast 被调用之前没有唤醒契约(Contract)。每当您对状态进行一些更改可能导致谓词的真值发生更改时,您都需要调用这些函数之一。

关于c - pthread_cond_wait 无限期地阻塞(休眠)直到 pthread_cond_signal 被 C 中的另一个线程调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150766/

相关文章:

ruby - 如何在 Ruby 进程中捕获信号

ruby - QListView 的 clicked() 信号

c - 这段 C 代码的作用是什么

c - 更新的命令行参数

c - 对 PTHREADS 过于偏执?

c - 为什么 valgrind 仅通过多次运行程序就报告不同的结果(不可能/仍然可以到达泄漏)?

c - lsetxattr 和 lgetxattr 函数的使用

c - 将 int 字节转换为 4 个字节后,我如何才能移回 int (C)

c - 使用互斥体的 Pthread 同步未正确同步单词

c - 在信号处理程序中访问长整数