正常释放
等待线程执行结束,和回收资源。
线程在函数执行结束以后,需要回收资源。
线程有两种状态joinable
和unjoinable
。
unjoinable
下,线程所使用的资源不会被释放,直到joinable
。
pthread_join(pthread_t,void *)
使函数变为
joinable
第一个参数是线程id,第二个参数可以是函数的返回值,如果是NULL
表示我们不关心函数的返回值。如果需要返回值,需要先创建对应的结构体,然后传入指针,让函数填充。
程序将会在该语句出堵塞,直到线程执行完毕返回。即使有很多该函数也会依次执行。
int pthread_atfork(void (prepare)(void), void (parent)(void), void (*child)(void));
pthread_detach(pthread_t)
即使函数没执行完也可以使用该函数制定线程的状态
执行该函数后,线程中函数运行结束后直接释放所消耗的资源。
异常释放
线程异常中断,被别的线程取消执行。
在POSIX线程API中提供了一个pthread_cleanup_push()/pthread_cleanup_pop()函数对用于自动释放资源:
从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作(包括调用 pthread_exit()和取消点终止)都将执行pthread_cleanup_push()所指定的清理函数。
API定义如下:
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)
pthread_cleanup_push()/pthread_cleanup_pop()采用先入后出的栈结构管理
void routine(void *arg)函数在调用pthread_cleanup_push()时压入清理函数栈,多次对pthread_cleanup_push()的调用将在清理函数栈中形成一个函数链,在执行该函数链时按照压栈的相反顺序弹出。
execute参数表示执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,为0表示不执行,非0为执行
这个参数并不影响异常终止时清理函数的执行。
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
pthread_mutex_lock(&mut);
/* do some work */
pthread_mutex_unlock(&mut);
pthread_cleanup_pop(0);
未完。。。
网友评论