linux线程控制&线程分离

线程概念

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。多线程

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为多线程。函数

线程资源

因为一个程序中的多个线程共享同一地址空间,所以代码段,数据段内容是共享的。除此以外,如下内容也是共享的:spa

1. 文件描述符表
2. 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
3. 当前工做目录
4. 用户id和组id线程

但有些资源是每一个线程各有一份的:指针

1. 线程idblog

2.上下文,包括各类寄存器的值、程序计数器和栈指针
3. 栈空间
4. errno变量
5. 信号屏蔽字
6. 调度优先级进程

 

线程控制

建立:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
获取线程id:pthread_t pthread_self(void);资源

终止线程

若是须要只终止某个线程而不终止整个进程,能够有三种方法:
1. 从线程函数return。这种方法对主线程不适用,从main函数return至关于调用exit。//线程return
2. 一个线程能够调用pthread_cancel终止同一进程中的另外一个线程。//被动终止
3. 线程能够调用pthread_exit终止本身。//本身终止it

等待线程

       int pthread_join(pthread_t thread, void **retval);
调用该函数等待的线程将挂起等待,直到id为thread的线程终止。线程以不一样方式终止,pthread_join获得的结果是不一样的。具体以下:thread

1线程以return方式终止,那么retval指向的单元保存的是thread函数的返回值

2若是进程被pthread_cancel方式终止,那么retval保存的是常数PTHREAD_CANCELED

3若是进程是pthread_exit方式终止本身,那么reval保存用户传给exit的参数

注:对于线程进行join以后线程的状态将是detach状态(分离),一样的pthread_cancel函数能够对线程进行分离处理。因此,不能同时对一个线程进行join和detach操做

线程分离

在任意一个时间点上,线程是可结合(joinable)或者是可分离的(detached)。一个可结合线程是能够被其余线程收回资源和杀死的。在被回收以前,他的存储器资源(栈等)是不释放的。而对于detached状态的线程,其资源不能被别的线程收回和杀死,只有等到线程结束才能由系统自动释放

默认状况,线程状态被设置为结合的。因此为了不资源泄漏等问题,一个线程应当是被显示的join或者detach的,不然线程的状态相似于进程中的Zombie Process。会有部分资源没有被回收的。

调用函数pthread_join,当等待线程没有终止时,主线程将处于阻塞状态。若是要避免阻塞,那么

在主线程中加入代码pthread_detach(thread_id)

或者在被等待线程中加入pthread_detach(thread_self())

相关文章
相关标签/搜索