add a cleanup function for thread
function adds cleanup_routine to the top of the stack
of cleanup handlers that get called when the current thread exits.
When cleanup_routine is called, it is passed arg as its only argument.
pthread_cleanup_push() does not return any
pthread_cleanup_push() conforms to
ISO/IEC 9945-1:1996 (“POSIX.1”).