您的位置:首页 > 运维架构 > Linux

linux线程控制&线程分离

2017-04-10 18:09 381 查看

线程概念

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程资源

由于一个程序中的多个线程共享同一地址空间,因此代码段,数据段内容是共享的。除此之外,以下内容也是共享的:
1. 文件描述符表

2. 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

3. 当前工作目录

4. 用户id和组id
但有些资源是每个线程各有一份的:
1. 线程id
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终止自己。//自己终止



等待线程

       int pthread_join(pthread_t thread, void **retval);

调用该函数等待的线程将挂起等待,直到id为thread的线程终止。线程以不同方式终止,pthread_join得到的结果是不同的。具体如下:
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())

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 linux