#include #include #include pthread_mutex_t mtx; pthread_cond_t cond; void unlock_mtx(void *a) { pthread_mutex_unlock((pthread_mutex_t *)a); } void *thr_routine(void *arg) { printf("%s\n", __func__); while (1) { pthread_mutex_lock(&mtx); pthread_cleanup_push(&unlock_mtx, &mtx); pthread_cond_wait(&cond, &mtx); pthread_cleanup_pop(0); pthread_mutex_unlock(&mtx); } return (0); } void handler(int sig) { write(1, "sig handler\n", 13); } int main() { pthread_t td; void *retval; pthread_mutex_init(&mtx, NULL); pthread_cond_init(&cond, NULL); signal(SIGUSR1, handler); for (;;) { pthread_create(&td, NULL, thr_routine, NULL); sleep(1); printf("sending SIGUSR1...\n"); pthread_kill(td, SIGUSR1); sleep(1); printf("cancelling thread...\n"); pthread_cancel(td); pthread_join(td, &retval); if (retval == PTHREAD_CANCELED) printf("canceled\n"); else printf("thread exit code: %d\n", (int)retval); } return (0); }