/* * Invoke pthread_cond_destroy() on a condition variable that is being waited * upon. */ #include <assert.h> #include <errno.h> #include <stdio.h> // printf() #include <pthread.h> static pthread_mutex_t s_mutex; static pthread_cond_t s_cond; static int s_i; static const char* err_to_str(int errnum) { switch (errnum) { case 0: return "success"; case EBUSY: return "EBUSY"; case EINVAL: return "EINVAL"; default: return "?"; } } static void* thread_func(void* thread_arg) { pthread_mutex_lock(&s_mutex); s_i = 1; pthread_cond_signal(&s_cond); while (s_i == 1) pthread_cond_wait(&s_cond, &s_mutex); pthread_mutex_unlock(&s_mutex); return 0; } int main(int argc, char** argv) { pthread_t threadid; int ret; pthread_mutex_init(&s_mutex, 0); pthread_cond_init(&s_cond, 0); pthread_create(&threadid, 0, thread_func, 0); pthread_mutex_lock(&s_mutex); while (s_i == 0) pthread_cond_wait(&s_cond, &s_mutex); pthread_mutex_unlock(&s_mutex); ret = pthread_cond_destroy(&s_cond); fprintf(stderr, "First pthread_cond_destroy() call returned %s.\n", err_to_str(ret)); pthread_mutex_lock(&s_mutex); s_i = 2; pthread_cond_signal(&s_cond); pthread_mutex_unlock(&s_mutex); pthread_join(threadid, 0); ret = pthread_cond_destroy(&s_cond); fprintf(stderr, "Second pthread_cond_destroy() call returned %s.\n", err_to_str(ret)); pthread_mutex_destroy(&s_mutex); return 0; }