多线程程序设计技术(原理篇)

  1. 基本概念

线程:是指一些相关指令的离散序列。线程与其他指令序列的执行相互独立。

线程层次:

  • 用户级线程:在应用软件中所创建和操纵的线程。
  • 内核级线程:操作系统实现大多数线程的方式。
  • 硬件线程:线程在硬件执行资源上的表现形式。

三个层次关系是,开发人员在用户级线程进行设计编码(调用线程库API),操作系统在内核级进行线程管理,并完成软件线程到硬件线程的映射工作。

   2.核心理论

多线程程序设计基本思想

三种问题分解方式:

  • 任务分解:不同的程序行为采用不同的线程实现。是对问题域进行纵向切割。
  • 数据分解: 多个线程对不同的数据块执行相同的操作。是对问题域进行横向切割。(将需要进行相同处理大块数据分成小块并行处理)
  • 数据流分解:一个线程的输出作为另一个线程的输入。(即流水线模型)

  同步理论

同步是对线程执行的顺序进行强行限制的一种机制,用来控制线程执行的相对顺序。

同步一般通过三种原语实现:

  • 信号量

经典P,V操作理论,典型应用为保护至多允许n个请求并行访问的共享资源。

锁可以看成信号量的的一个特殊实现。目前主要有4中类型:

  1. 互斥量(Mutex):最简单的锁类型。互斥量的释放一般需要引入定时器实现来保证健壮性。
  2. 递归锁(Recursive Lock):递归需哦是指可以被当前持有该锁的线程重复获取,而不会导致该线程产生死锁的所类型(防止递归死锁)
  3. 读写锁(Read-Write Lock):读写锁允许多个线程同时进行读访问,但是在某一时刻却最多只能由一个线程执行写操作。
  4. 旋转锁(Spin Lock):主要用于多处理器系统。采用旋转锁时,等待线程并不是静态地阻塞在同步点,而是必须“旋转”,不断尝试获得该锁(即保持占有一个处理核的使用权)。旋转锁适合于任何锁持有时间少于将一个线程阻塞和唤醒所需时间的场合。
  • 条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。其三种原子操作

wait(L),singal(L),broadcast(L)

注:L是与条件变量配合使用的锁。

你可能感兴趣的:(C/C++)