/** Cancel a thread that holds a lock on a mutex. */ #include #include #include pthread_cond_t s_cond; pthread_mutex_t s_mutex1; pthread_mutex_t s_mutex2; static void* thread(void* arg) { /* Lock s_mutex2. */ pthread_mutex_lock(&s_mutex2); /* Inform the main thread that s_mutex2 has been locked, and wait for pthread_cancel(). */ pthread_mutex_lock(&s_mutex1); pthread_cond_signal(&s_cond); pthread_cond_wait(&s_cond, &s_mutex1); return 0; } int main(int argc, char** argv) { pthread_t tid; /* Initialize synchronization objects. */ pthread_cond_init(&s_cond, 0); pthread_mutex_init(&s_mutex1, 0); pthread_mutex_init(&s_mutex2, 0); /* Create thread. */ pthread_mutex_lock(&s_mutex1); pthread_create(&tid, 0, &thread, 0); /* Wait until the created thread has locked s_mutex2. */ pthread_cond_wait(&s_cond, &s_mutex1); pthread_mutex_unlock(&s_mutex1); /* Cancel the created thread. */ pthread_cancel(tid); /* Join the created thread. */ pthread_join(tid, 0); /* Invoke pthread_cancel() with an invalid thread ID. */ pthread_cancel(tid); fprintf(stderr, "Test finished.\n"); return 0; }