线程学习笔记

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被赋值时,对象总是完成的。

未完待续..........

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值