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 に答える