c++ - 为什么在调用 pthread_cond_broadcast 后调用 pthread_cond_wait 不立即返回?

标签 c++ multithreading

标题基本上不言自明。休眠5秒并解锁互斥锁后,它终于从pthread_cond_wait返回。好像pthread_cond_wait知道自己拿不到互斥量,所以一直等,解锁互斥量后,pthread_cond_wait拿到互斥量,然后继续。。是这样吗?

   #include <pthread.h>



pthread_mutex_t alarm_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t alarm_cond = PTHREAD_COND_INITIALIZER;
int s_i = 0;




void* alarm_thread ( void* arg )
{
    pthread_mutex_lock ( &alarm_mutex );

    while ( 1 )
    {
        while ( s_i == 1 )
        {
            pthread_cond_wait ( &alarm_cond, &alarm_mutex );
            printf("I am here");
        }
    }
}

int main ( int argc, char* argv[] )
{
    pthread_t thread;
    pthread_create ( &thread, NULL, alarm_thread, NULL );
    pthread_mutex_lock ( &alarm_mutex );
    s_i = 1;
    pthread_cond_broadcast ( &alarm_cond );
    sleep ( 5 );
    pthread_mutex_unlock ( &alarm_mutex );
}

最佳答案

pthread_cond_wait 函数在等待时释放互斥锁,然后返回并再次获取互斥锁。如果另一个线程持有互斥量,则该线程在释放互斥量之前无法恢复执行。如果这对您造成问题,则说明您使用的条件变量不正确。

互斥量需要在线程等待时释放,否则其他线程无法获取。在返回之前需要重新获取互斥量——如果没有其他原因,允许线程检查是否需要再次调用 pthread_cond_wait

关于c++ - 为什么在调用 pthread_cond_broadcast 后调用 pthread_cond_wait 不立即返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13975016/

相关文章:

python - 在Python中并行读取多个文件

c++ - Qt 应用程序和 Google Breakpad

c++ - 给定一个矩形区域和一组矩形,检查整个区域是否被它们覆盖

c++ - 在 x86 机器上移动超过 32 位的 uint64_t 整数未定义行为?

java - 在 Java 中制作偶数和奇数线程以自然顺序打印数字

ruby - Ruby Thread 的派生类?

c++ - 使用二进制文件进行简单的高分更新

c++ - 如何在从用户锁定主窗口时让 Qt 对话框获取信息?

c++ - absl::Mutex 的条件临界区如何处理读者唤醒

c# - 从不同线程调用时,WCF Duplex 回调方法从不执行