线程资源:线程ID,一组寄存器,栈,调度优先级和策略,信号屏蔽字,errno变量,线程私有数据。
进程的共享资源:进程的可执行代码,全局内存,堆内存,栈和文件描述符
linux
int pthread_equal(pthread_t tid1, pthread_t tid2); int pthread_self();
Linux使用无符号长整形表示pthread_t
异步
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn(void*)), void* restrict arg);
在调用失败后,返回错误码,而不是设置errno
函数
若是进程中任意线程调用了exit、_Exit或者_exit,那么整个进程就会终止。
单个线程能够经过3种方式退出,所以能够在不终止整个进程的状况下,中止它的控制流:
spa
线程能够简单地从启动例程中返回,返回值是线程的退出码
操作系统
线程能够被同一进程中的其余线程取消
线程
线程调用pthread_exit
指针
void pthread_exit(void *rval_ptr);
int pthread_join(pthread_t thread,void **rval_ptr);
调用pthread_join后,调用线程将一直阻塞,直到指定的线程退出。利用rval_ptr_ptr 访问 rval_ptr
rest
int pthread_cancel(pthread_t tid);
线程能够经过调用pthread_cancel函数来请求取消同一进程中的其余进程。
pthread_cancel并不等待线程终止,它仅仅提出请求,线程能够选择
忽略取消或者控制如何被取消。
code
void pthread_cleanup_push(void (*rtn)(void *),void *arg); void pthread_cleanup_pop(int execute);
1 .线程能够安排它退出时须要调用的函数,这与进程在退出时能够用atexit函数安排退出时相似的。
2. 若是线程是经过从它的启动例程中退出返回而终止的话,它的清理处理程序就不会被调用。
3. rtn函数并非只有在线程结束时,才会被调用。参看第四条
4. 若是pthread_cleanup_pop被调用且execute参数设置为非0,则[调用并删除]上次pthread_cleanup_push调用创建的清理处理程序。若是execute参数为0,则清理函数将不被调用(只删除)。
进程
线程的分离状态属性
PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE (默认)
线程栈的最低地址
线程栈的大小
线程栈末尾的警惕缓冲区大小
可取消状态
PTHREAD_CANCEL_ENABLE(默认)
PTHREAD_CANCEL_DISABLE
可取消类型
PTHREAD_CANCEL_DEFERRED(默认)
PTHREAD_CANCEL_ASYNCHRONOUS
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
若是不想了解现有某个线程的终止状态,可使用pthread_detach函数让操做系统在线程退出时候收回它所占用的资源。
建立线程时候能够修改pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。
detatchstate值:
PTHREAD_CREATE_DETACHED: 分离状态启动
PTHREAD_CREATE_JOINABLE 正常启动,应用程序能够获取线程的终止状态
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize); int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);
尽可能使用 pthread_attr_setstacksize, 除非线程对栈的地址空间有特殊要求
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
linux3.2.0 线程的默认栈空间为8MB,能够设定的最小栈空间为16KB
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
1. guardsize控制着线程栈末尾以后用以免栈溢出的扩展内存的大小。当栈指针溢出到警惕区时,应用程序接受到出错信息
2. 若利用pthread_attr_setstack,系统认为咱们将本身管理栈,进而使栈警惕缓冲区机制无效,至关于guardsize等于0
3. linux guardsize的默认大小为4KB,
int pthread_setcancelstate(int stat,int *oldstate); 若成功,返回0;不然,返回错误编号
1.调用该函数且stat为PTHREAD_CANCEL_DISABLE后,取消请求处于挂起状态。当取消状态再次变为PTHREAD_CANCLE_ENABLE时,
线程将在下一个取消点上对全部的取消请求进行处理。
2.pthread_cancel(tid)调用并不等待线程终止。在默认状况下,线程tid在取消请求发出之后仍是继续运行,直到线程达到某个取消点。
void pthread_testcancel(void); 能够调用pthread_testcancel函数在程序中添加本身的取消点
int pthread_setcanceltype(int type,int *oldtype);
type参数能够是PTHREAD_CANCEL_DEFERRED(默认),也能够是PTHREAD_CANCEL_ASYNCHRONOUS(异步取消)。
若是使用异步取消。线程能够在任意时间撤销(linux上通常接收到信号便结束),而不是遇到取消点才能被取消。