linux线程控制&线程分离
2016-07-20 01:35
399 查看
线程概念
线程,有时被称为轻量级进程(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之进程
- linux 体系结构知识 博客
- <Linux> 小册子
- 云服务器 ECS Linux 系统添加“回收站”
- 云服务器 ECS Linux 系统 CPU 占用率较高问题排查思路
- 云服务器 ECS Linux 误删除文件恢复方法介绍
- mysql官方下载安装教程(centos)
- 云服务器 ECS Linux 系统中常见的日志文件介绍
- 云服务器 ECS Linux 服务器修改时区的两种方式
- php安装ssh2扩展的方法【Linux平台】
- Linux环境下mysql5.7.13安装教程
- linux 下密码生成方法
- Linux最佳的云存储服务分析
- Linux 端口详解
- CentOS下yum安装PHP
- linux 下 安装 node.js 详细步骤
- 在CentOS-x86_64位机器下编译hadoop-2.6.0源码
- 云服务器 ECS Linux 磁盘空间满(含 innode 满)问题排查方法
- 在 Linux 上使用 VirtualBox 的命令行管理界面
- centos 缓存清理 使用free查看发现内存怎么那么少