1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 6 static void thread_cleanup(void *arg) 7 { 8 printf("cleaning up 0x%lx\n", (long)arg); 9 10 return; 11 } 12 13 static void *thread_main(void *arg) 14 { 15 pthread_cleanup_push(thread_cleanup, (void *)0x1234); 16 pthread_cleanup_push(thread_cleanup, (void *)0x5678); 17 18 if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0) 19 { 20 perror("pthread_setcanceltype"); 21 return NULL; 22 } 23 24 if (pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0) 25 { 26 perror("pthread_setcancelstate"); 27 return NULL; 28 } 29 30 pause(); 31 32 pthread_cleanup_pop(0); 33 pthread_cleanup_pop(0); 34 35 return NULL; 36 } 37 38 int main(int argc, char **argv) 39 { 40 pthread_t tid; 41 void *result; 42 43 if (pthread_create(&tid, NULL, thread_main, NULL) != 0) 44 { 45 perror("pthread_create"); 46 exit(1); 47 } 48 49 sleep(1); 50 51 if (pthread_cancel(tid) != 0) 52 { 53 perror("pthread_cancel"); 54 exit(1); 55 } 56 57 if (pthread_join(tid, &result) != 0) 58 { 59 perror("pthread_join"); 60 exit(1); 61 } 62 63 printf("result is %s\n", result == PTHREAD_CANCELED ? "correct" : "incorrect"); 64 65 exit(0); 66 } 67