1. 并行编程
在现代的多核机器上,多线程非常适合并行编程,并且任何适用于一般并行编程的内容都适用于并行多线程程序。
设计并行程序有很多考虑因素,例如:
- 使用什么类型的并行编程模型?
- 问题划分
- 负载均衡
- 通讯
- 数据依赖
- 同步和竞争条件
- 内存问题
- 输入输出问题
- 程序复杂度
- 程序员的工作量/成本/时间
但总的来说,为了让程序利用多线程,它必须能够组织成可以并发执行的离散、独立的任务。例如,如果线程1 和线程2 可以实时互换、交错和/或重叠,则它们是线程化的候选对象。
具有以下特征的程序可能非常适合线程:
- 可以由多个任务同时执行的工作或可以操作的数据:
- 阻塞的长时间 I/O 等待
- 在某些地方使用许多 CPU 循环调用,但在其他地方不使用
- 必须响应异步事件
- 有些工作比其他工作更重要(优先中断)
几种线程程序的常见模型:
- Manager/worker:单个线程,管理器将工作分配给其他线程,即工人。通常,经理处理所有输入并将工作分配给其他任务。至少有两种形式的管理器/工作器模型是常见的:静态工作器池和动态工作器池。
- Pipeline(流水线):一个任务被分解成一系列子操作,每个子操作都由不同的线程串行处理,但同时进行。汽车装配线最能描述这种模型。
- Peer : 类似于 manager/worker 模型,但主线程创建其他线程后,参与工作。
2. 共享内存模型
所有线程都可以访问相同的全局共享内存。
线程也有自己的私有数据。
程序员负责同步访问(保护)全局共享数据。
3. 线程安全
线程安全性:简而言之,是指应用程序能够同时执行多个线程而不会“破坏”共享数据或创建“竞争”条件。
例如,假设您的应用程序创建了多个线程,每个线程调用同一个库例程:
- 该库例程访问/修改内存中的全局结构或位置。
- 当每个线程调用此例程时,它们可能会同时尝试修改此全局结构/内存位置。
- 如果例程不采用某种同步结构来防止数据损坏,那么它就不是线程安全的。
4. 线程限制
尽管 Pthreads API 是 ANSI/IEEE 标准,但实现可能通常会以标准未指定的方式变化。因此,在一个平台上运行良好的程序可能会在另一个平台上失败或产生错误的结果。例如,允许的最大线程数和默认线程堆栈大小是设计程序时要考虑的两个重要限制。
翻译: https://hpc-tutorials.llnl.gov/posix/designing_threaded_programs/