linux线程结束

Linux下线程有三种结束的方法:
    1. 线程函数执行完毕,线程正常结束;
    2. 线程调用pthread_exit(void* rval_ptr)
    3. 线程被取消(也就是其他线程调用pthread_cancel(pthread_t)
这里主要总结一下线程调用pthread_exit和pthread_cancel结束的问题。
一. 线程被取消:
     线程被取消,就是其他线程调用pthread_cancel(pthread_t thread)方法,thread参数就是你想要取消的线程的线程ID。调用此函数是有要求的,它要求thread标识的线程的cancel state必须是PTHREAD_CANCEL_ENABLE状态,如果之前参数thread标识的线程调用了pthread_setcancelstate(int state,int*oldstate)更改线程的cancel state为PTHREAD_CANCEL_DISABLE,调用pthread_cancel就会出错。
还有一点需要注意,默认情况下,pthread_cancel是对某线程进行延迟取消。换句话说,被取消的线程并不会立即结束,它会一直运行,知道碰到某个取消点(取消点就是操作系统判断是否线程被取消的地方),我们也可以通过使用pthread_testcancel(void)函数添加取消点;那么如果我们想当我们想让某个线程立即结束,而不是等到某个取消点才结束,怎么办?答案是更改线程的被取消类型:pthread_setcanceltype(int type,int* oldtype).将参数type更改为PTHREAD_CANCEL_ASYNCHRONOUS即可。如果又想改为线程默认取消类型,则更改为PTHREAD_CANCEL_DEFEREED。
二. 线程退出(pthread_exit)
    使用pthread_exit(void* rval_ptr)可以从线程函数返回,并且将rval_ptr的指向的内容返回。我们可以通过使用pthread_join(void** rval_ptr)获得返回值。调用pthread必须保证线程是joinable的
三. 线程退出函数
    线程退出函数与进程退出函数atexit()相似,使用pthread_cleanup_push(void(*rin)(void*),void*arg)对清理函数进行压栈,使用pthread_cleanup_pop(int execute)进行出栈。
出现如下情况之一,就会调用线程退出函数:
    1. 调用了pthread_exit;
    2. 其他线程调用了pthread_cancel;
    3. 使用非0的execute调用了pthread_cleanup_pop()
需要注意的是,如果使用0调用了pthread_cleanup_pop,函数栈只会出栈操作,而不会对函数进行调用;

你可能感兴趣的:(linux)