线程

1. 什么是线程?

从技术上讲,线程被定义为一个独立的指令集,可以由操作系统调度运行。

对于开发人员来说,独立于主程序运行的”过程“的概念可能是对线程的最好的描述。

在理解线程之前,首先需要理解UNIX进程。

一个进程是由操作系统创建,并且需要相当数量的”开销“。进程包含有关程序资源和程序执行状态的信息,包括:

  • 进程ID
  • 环境变量
  • 工作目录
  • 程序指令
  • CPU状态
  • 堆栈
  • 文件描述符
  • 信号动作
  • 共享库
  • 进程间通信相关信息

线程使用并存在于这些进程资源中,但为了能够由操作系统调度并作为独立实体运行,线程只拥有使它能够作为可执行代码存在的基本资源,例如:

  • 堆栈指针
  • 寄存器
  • 调度属性
  • 挂起和阻塞信号集
  • 线程特定数据

2. 并行编程

线程非常适合并行编程,设计并行程序有很多的注意事项。例如:

  • 并行编程模型
  • 通信
  • 数据依赖关系
  • 同步和竞争条件
  • 内存问题
  • I/O 问题

2.1 共享内存模型

所有线程都可以访问相同的全局共享内存,但线程也有自己的私有数据。需要同步和保护对全局数据的访问。

2.2 线程安全

简而言之,线程安全是指应用程序同时执行多个线程的能力,而不会“破坏”共享数据或创建竞争条件。

3. 空间布局

线程之间共享一份全局内存区域,包括初始化数据段、未初始化数据段(bss)、堆内存段。Linux中通过pthread_create创建线程,glibc要为每个线程独立分配线程栈,线程栈位于mmap区(位于栈和堆的中间,从高地址向低地址延伸)。

线程空间地址

posted @ 2025-07-29 08:51  星空丶star  阅读(172)  评论(0)    收藏  举报