Linux线程的基础知识
来源:互联网 发布:ark网络加速器 安卓版 编辑:程序博客网 时间:2024/05/22 03:06
之前我们已经介绍过进程的基本概念,那么线程是什么?
线程是进程内部的一个执行分支,举个栗子:比如一个项目的完成是多个团队之间的合作,和每个团队都是这个项目运行的一个分支。即线程是进程内部的执行分支。
进程的特点:
(1)系统中程序执行和资源分配的基本单位
(2)每个进程都有自己的数据段、代码段、堆栈区
(3)在进行切换时需要比较复杂的上下文切换
线程特点:
(1)减少处理机的空转时间,支持多处理器以及减少上下文切换开销,比创建进程小很多
(2)进程内独立的一条运行路线
(3)线程是CPU调度的基本单位(有多个执行流时才需要调度),也成为轻量级进程
linux中没有真正意义上的线程,所以我们用进程模拟线程,如下图:
各线程之间共享以下资源和环境:
(1)文件描述符表
(2)每种信号的处理方式(SIG_IGN, SIG_DFI或者用户自定义的信号处理函数)
(3)当前工作目录
(4)用户id和组id
任何线程对系统资源的操作都会给其他线程带来影响
各线程私有以下资源:
(1)线程id
(2)上下文,包括各种寄存器的值,程序计数器和栈指针
(3)栈空间
(4)error变量
(5)信号屏蔽字
(6)调度优先级
Linux下的线程库函数是由POSIX标准定义的,称为POSIX thread或pthread。linux中线程函数位于libpthread共享库中,因此在编译时要加上Ipthread。
线程标识:
线程id
进程id在整个系统中是唯一的,线程id只在它所属的进程环境中有效
函数:pthread_self()
返回值:调用线程的id
pthread_t类型通常用结构体表示,不能把它作为整数处理(linux使用无符号长整数表示),为了移植,使用函数来比较线程:pthread_equal()
若两个线程id相等则返回非0值。否则返回0.
创建进程:pthred_create
参数的含义:thread-线程标识符、attr-线程属性设置,通常取NULL、start_routin-线程函数的起始地址,是一个以指向void的指针作为参数和返回值的指针,arg-传递给start_routine的参数。成功返回0,失败返回错误码。
运行结果如下:
退出线程:pthread_exit()
reval-线程结束时的返回值,可由其他函数如pthread_join()来获取。
exit是退出进程,不能用来退出线程。
在任何一个时间点上,线程是可结合的或者分离的。一个可结合的线程能够被其他线程收回其资源和杀死。在其他资源回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
等待线程:pthread_join()
th-等待线程的标识符
thread_return-用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)。成功放回,出错返回错误码。
由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不胡随着线程的终止而得到释放,等待方式为阻塞时等待。
取消线程:pthread_cancel()
th-要取消的线程的标识符。成功返回,出错返回错误码。
作用:取消同一进程中的其他线程,被取消的线程可以设置自己的取消状态,被取消的线程接收到另一个线程的取消请求后,是接受还是忽略这个请求,如果接受,是立刻进行终止操作还是等待某个函数的调用等。
进程分离:pthread_detach()
将子线程设置为分离的,则线程结束后会自动释放所有资源。
- Linux线程的基础知识
- linux线程基础知识
- 线程的基础知识
- 线程的基础知识【转帖】
- 线程的基础知识
- 线程的基础知识(ZT)
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 线程的基础知识
- 在工厂模式中使用Properties配置文件出现java.lang.ExceptionInInitializerError的问题
- @PathVariable和@RequestParam的区别
- Android SeekBar控件详解
- David Silver《Reinforcement Learning》课程解读—— Lecture 3: Planning by Dynamic Programming
- Echarts3简单封装及其调用示例
- Linux线程的基础知识
- tensorflow学习笔记(三):手写字符识别实例
- 隐私政策
- F
- iOS11开发新增功能大全
- js小知识
- Android 蓝牙BLE开发详解
- Mac安装android studio后卡在building gradle project info的解决方法
- Ubuntu16.04+anaconda2+opencv3.2.0