如果进程中的任意线程调用了exit、_Exit或者_exit,那么整个进程就会终止。
单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。
(1)线程可以简单地从启动例程中返回,返回值是线程的退出码。
(2)线程可以被同一进程中的其他线程取消。
(3)线程调用pthread_exit。
#include <pthread.h> void pthread_exit(void *rval_ptr); |
---|
rval_ptr参数是一个无类型指针。进程中的其它线程可以通过pthread_join函数访问到这个指针。
#include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); 返回值:若成功,返回0;否则,返回错误编号。 |
---|
调用pthread_join的线程将一直阻塞,指导制定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程简单的从例程中返回,rval_ptr就包含返回码。如果线程被取消,由rval_ptr指定的内存单元就设置为PTHREAD_CANCELED。
如果对线程的返回值不感兴趣,可以将rval_ptr置空。
注意:pthread_create和pthread_exit函数的无类型指针参数数指向的内存在调用者完成调用以后必须是仍然有效的。
线程可以通过调用pthread_cancel函数来请求取消统一进程中的其它线程。
#include <pthread.h> int pthread_cancel(pthread_t tid); 返回值:若成功,返回0;否则,返回错误编号 |
---|
线程可以安排它退出时需要调用的函数。这样的函数被称为线程清理处理程序(thread cleanup handler)。一个线程可以建立多个清理处理程序。处理程序记录在栈中,它们的执行顺序可它们注册时相反。
#include <pthread.h> void pthread_cleanup_push(void (*rtn)(void *), void *arg); void pthread_cleanup_pop(int execute) |
---|
当线程执行以下动作时,清理函数rtn是由pthread_cleanup_push函数调度的,调用时只有一个参数arg:
● 调用pthread_exit时;
● 相应取消请求时;
● 用非零execute参数调用pthread_cleanup_pop时。
如果execute参数设置为0,清理函数将不被调用。不管发生上述那种情况,pthread_cleanup_pop都将删除上次pthread_cleanup_push调用建立的清理处理程序。
如果线程是从他的启动例程中返回而终止的话,它的清理处理程序就不会被调用。
在默认情况下,线程的终止状态会保存至该线程调用pthread_join。如果线程已经被分离,线程的底层存储支援可以再线程终止时立即被回收。在线程分离之后,不能用pthread_join函数等待它的终止状态,因为对分离状态的线程调用pthread_join会产生未定义行为。可以调用pthread_detach分离线程。
#include <pthread.h> int pthread_detach(pthread_t tid) 返回值:若成功,返回0;否则,返回错误编号 |
---|