/* copyright(c) 2010 davidxu@freebsd.org */ #include #include #include #include #include pthread_key_t sem_key; int loops; void usr1_handler(int sig) { sem_t *s = (sem_t *)pthread_getspecific(sem_key); sem_post(s); } void * sub_routine(void *arg) { sem_t *s = (sem_t *)arg; pthread_setspecific(sem_key, arg); sem_post(s); for (;;) sleep(1); } void * thr_routine(void *arg) { pthread_t subtd; sem_t sem; int i; sem_init(&sem, 0, 0); if (pthread_create(&subtd, NULL, sub_routine, &sem)) { printf("can not create thread\n"); exit(2); } sem_wait(&sem); for (i = 0; i < loops; ++i) { pthread_kill(subtd, SIGUSR1); sem_wait(&sem); } pthread_cancel(subtd); pthread_join(subtd, NULL); return (NULL); } int main(int argc, char *argv[]) { pthread_t *td; int i; int pairs; if (argc < 3) { printf("usage:\n\t %s \n", argv[0]); return (1); } pairs = atoi(argv[1]); loops = atoi(argv[2]); td = malloc(sizeof(pthread_t) * pairs); pthread_key_create(&sem_key, NULL); signal(SIGUSR1, usr1_handler); for (i = 0; i < pairs; ++i) { if (pthread_create(&td[i], NULL, thr_routine, NULL)) { printf("can not create thread\n"); return (2); } } for (i = 0; i < pairs; ++i) pthread_join(td[i], NULL); free(td); return (0); }