线程学习笔记"/>
线程学习笔记
1、线程有时被称为轻量级进程(Lightweight Process,LWT),是程序执行的最小单元;
2、一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成;
3、通常意义下,一个进程由一个或者多个线程组成,各个线程之间共享内存空间(包括代码段、数据段、堆等)以及一些进程级的资源(如文件打开和信号);
4、经典的线程与进程关系图:
5、线程的访问权限:线程的访问权限是非常自由的,它可以访问进程内存中所有的数据,甚至其他线程的堆栈(如果知道其他线程的堆栈),实际应用中线程也拥有自己的私有的储存空间,包括几个方面:
- 栈 尽管并非无法被其他的线程访问,但一般可认为是私有数据;
- 线程局部储存 线程局部储存是某些操作系统为线程单独提供的私有空间,但通常只具有 很有限的空间;
- 寄存器(包括PC寄存器),寄存器是执行流的基本数据,因此是线程私有
6、线程调度,线程至少有三种状态:
- 运行:此线程正在执行;
- 就绪:此线程可以立即执行,但是CPU已经被占用;
- 等待:此线程正在等待某一个事件(通常是I/O或者同步)发生,无法执行。
处于运行中的线程拥有一段可以执行的时间,这段时间就做时间片(Time Slice),当时间片用尽时候,该线程处于就绪状态;如果在时间片用尽之前,线程就等待某事件,那么它进入等待状态;每当一个线程离开运行状态时,调度系统就会选择其他的就绪的线程继续执行。
7、线程安全 : 原子操作、加锁、信号量、临界区、互斥量、读写锁和条件变量。
8、单例线程安全问题:barrier指令会阻止CPU将该指令前的指令交换到barrier之后。
#define barrier() __asm__ volatile (”lwsync”)
volatile T* pInst = 0;
T* GetInstance(){if (!pInst) {lock();if (!pInst) {T* temp = new T;barrier();pInst = temp;}unlock();}
return pInst;
}
由于barrier的存在,对象的构造一定在barrier之前完成,因此当pInst被赋值时,对象总是完成的。
未完待续..........
更多推荐
线程学习笔记
发布评论