Я не могу найти в Интернете никаких доказательств того, что pthread_cond_wait
странно в Mac OS X, но, похоже, он не проходит самый простой тест для меня.
Функция
int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t * );
должен разблокировать аргумент мьютекса # 2, а затем дождаться отправки сигнала по условному аргументу # 1. Я написал простую программу для проверки этого, а также для проверки ложных пробуждений:
#include <stdio.h>
#include <pthread.h>
pthread_t spin_thread;
pthread_mutex_t spin_mutex;
pthread_cond_t spin_cond;
int actual = 0;
void *condspin( void *v ) {
int expected = 0;
for ( ;; ) {
if ( actual != expected ) printf( "unexpected %d\n", actual );
else printf( "expected %d\n", actual );
pthread_mutex_lock( &spin_mutex );
printf( "locked\n" );
expected = actual + 1;
pthread_cond_wait( &spin_cond, &spin_mutex );
}
return NULL;
}
int main( int argc, char ** argv ) {
pthread_mutex_init( &spin_mutex, NULL );
pthread_cond_init( &spin_cond, NULL );
pthread_create( &spin_thread, NULL, &condspin, NULL );
for ( ;; ) {
getchar();
pthread_cond_signal( &spin_cond );
printf( "signaled\n" );
++ actual;
}
return 0;
}
Но он получает блокировку только один раз. Основной поток даже не пытается получить блокировку просто для простоты.
Shadow:~ dkrauss$ cc condwait.c -o condwait
Shadow:~ dkrauss$ ./condwait
expected 0
locked
signaled
expected 1
signaled
signaled
Если я добавлю pthread_mutex_unlock
после pthread_cond_wait
, он будет вести себя как ожидалось. (Или так, как вы ожидаете, используя только половину механизма блокировки.) Итак, что дает?