Linux的多线程--初识
来源:互联网 发布:杰视帮美工教程 编辑:程序博客网 时间:2024/05/18 21:49
什么是线程?
说到线程,我们并不是很了解,之前学过一点进程的知识,那么线程与进程有什么关系呢?
我们知道,进程在各个独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,但是呢我们这里在Linux下学习的线程则是在一个进程的地址空间中执行的多个线程。在Linux的环境下并没有真正意义下的线程,线程是通过进程来模拟的。由于同一进程的多个线程共享同一地址空间,因此Text Segment、 Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一 个全局变量,在各线程中都可以访问到。
虽然Linux下没有真正的线程,但是Windows系统下还是存在线程的,所以在Linux下模拟实现的我们又称作为轻量级进程(LWP)。
我们大部分人都会下载电影对吧,那么很多人应该使用过迅雷之类的下载软件对吧,其实这些下载软件在下载电影时就用到了线程的概念。你可以同时下载多个电影,打开迅雷这个进程之后,你可以打开下载线程进行下载电影,同时你也可以打开播放线程进行播放,由这我们不难理解,进程是资源分的基本单位,而线程则是调度的基本单位。
当然,我们使用这类软件的事后也知道,你不可能在关闭软件后还能进行电影的播放或是下载对吧,所以我们可以再次学到在多线程运行时,一定要让主线程等待新线程结束后再结束释放资源。
线程属性
上面我提到在Linux下没有真正意义上的线程,Linux下的线程是通过进程去模拟实现的,所以又叫做轻量级进程。我们知道每一个进程都由操作系统通过PCB块来控制,进程通过PCB与地址空间与页表的合作访问物理空间。
当我们创建多个线程的时候,我们就会通过多个PCB(包括主线程)共享一块地址空间,即同享一份资源和环境。
各线程主要共享以下进程资源和环境:
1. 文件描述符表
2. 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
3. 当前工作目录
4. 用户id和组id
但有些资源是每个线程各有一份的:
1. 线程id
2. 上下文,包括各种寄存器的值、程序计数器和栈指针
3. 栈空间
4. errno变量
5. 信号屏蔽字
6. 调度优先级
线程操作函数
创建线程
参数:
- thread,为一个pthread_t类型的指针,指向一个内存单元。新创建的线程的线程ID会被设置在thread指向的内存单元。
- attr,用于定制各种不同的线程属性。
- start routine,为一个函数指针,新创建的线程从start routine函数的地址开始运行。该函数的参数是一个无类型指针参数。这个参数后面我们会提到。
- arg,为一个无类型指针,当我们需要为第三个参数函数指针传参时,那么便需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。可以理解为此arg参数就是上面函数指针的参数。
线程终止
线程等待
线程的分离
由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的连接请求),这时可以在在线程中加入代码pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)(非阻塞,可立即返回)这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。
- Linux的多线程--初识
- 初识Linux多线程编程
- C# 多线程的使用(Thread)-初识多线程
- Linux C 多线程【1】--简单初识
- 初识linux的shell
- 初识多线程
- 初识多线程
- 初识多线程
- 初识多线程
- 初识多线程
- 初识多线程
- 初识多线程
- eventlet引发的学习-初识多线程
- 初识java多线程的wait(), notify()方法
- linux下的LVM初识
- 初识Linux下的进程
- 初识Linux--Linux常用的命令小结
- 多线程(一):初识多线程
- 人生定势:作息,学习习惯,能力技能
- 白话经典算法系列之二 直接插入排序的三种实现
- Python 用OPEN读文件报错 ,路径以及r
- 灰度变换--imadjust和stretchlim
- 世豪先生:精致是一种生活态度的体现
- Linux的多线程--初识
- 简单的文本处理命令
- Scrapy爬虫实战一:获取中影国际影城信息
- VR系列——Oculus Rift 开发者指南:三、Oculus Rift的渲染(五)
- 通过源码分析MyBatis的缓存/Mybatis解析动态sql原理分析
- jQuery基本知识
- 浙大PAT甲级-1003
- Invalid bound statement (not found)
- POJ 1262 Input 笔记