0

标题基本上不言自明。在休眠 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 );
}
4

1 回答 1

2

pthread_cond_wait函数在等待时释放互斥锁,然后返回再次获取的互斥锁。如果另一个线程持有互斥锁,则该线程无法恢复执行,直到互斥锁被释放。如果这给您带来了问题,那么您使用的条件变量不正确。

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

于 2012-12-20T15:21:01.953 回答