多线程
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgMultiThreading
- 最后更新: 2020-11-30
通过 FreeBASIC 内置支持进行多线程编程。
前言:
多线程编程允许生成并发进程流。
它在多处理器或多核系统上最为有效,进程流可以被调度到另一个处理器/核心上运行,从而通过并行或分布式处理获得速度提升。
虽然在多处理器或多核系统上最为有效,但在单处理器或单核系统上也能获得收益,因为可以利用 I/O 及其他系统函数中可能导致进程执行暂停的延迟。
当一个线程等待 I/O 或某些其他系统延迟时,另一个线程可以继续执行。
线程所需的开销比生成新进程少,因为系统不需要为进程初始化新的系统虚拟内存空间和环境。
一个进程中的所有线程共享同一个地址空间。
定义
多线程进程包含两个或更多可以并发运行的部分。
这种程序的每个部分称为一个线程,每个线程定义了一条独立的执行路径。
进程与线程的区别:
- 进程:
- 线程:
线程是通过并行性提升程序性能的常用方式。
多线程编程
单线程程序每次执行一行代码,然后按顺序移动到下一行(分支、函数调用等除外)。
这通常是程序员编写代码时的默认行为。
创建线程有几个主要原因,例如:
你需要执行一个耗时较长的任务,但不想让用户等待其完成。这称为任务并行性。创建线程的目的是确保应用程序在用户界面中保持响应性,而不是让任务实际运行得更快。重要的是,任务必须能够在很大程度上独立于隐式主线程运行,这种设计模式才有用。
你有一个复杂的任务,可以通过将其分割成若干块来获得性能优势。在这里,你创建多个线程,每个线程专门处理任务的一部分。当所有部分都完成后,主线程将子结果汇总为最终结果。这种模式称为并行聚合模式。要使其工作,任务或计算的总结果的各部分必须能够独立计算——结果的第二部分不能依赖于第一部分,等等。
多线程程序同时从程序的两个或多个位置执行(或者至少有同时运行的错觉):
- 排序概述:
- 多处理器或多核系统上的线程:
- 线程安全:
- 同步对象:
多线程相当危险,这里的错误代价非常高昂。当发现问题时,调试要么很困难,要么不可能,但这还不是最糟糕的。
最糟糕的是当代码有错误,但却能正确运行时。
这种情况可能发生,因为一旦使用了线程,执行流程就不再是确定性的了。
创建一个新线程需要多长时间?
可以有多少个并发线程?
CPU 时间在线程之间如何分配?
建议始终在每个线程(包括主线程)的每个 For 循环中设置 Sleep x, 1 节拍,以释放时间片,让其他线程也能够执行。
所有这些因素都会影响整体执行。编写多线程代码就是要做好准备应对任何情况,这既使其危险,又使其令人兴奋。
多线程内置支持
如果使用了 FreeBASIC 内置线程函数,则会自动使用线程安全的运行时库(因此,只有当程序员想使用自己的线程例程时,才需要链接器的 -mt 编译器选项)。
本节("多线程")的以下页面将说明:
参见
返回 目录