跳转到内容

优化 C++/编写高效代码/线程使用

来自维基教科书,开放的世界,开放的书籍

工作线程

[编辑 | 编辑源代码]

在交互式应用程序中,每当您需要执行可能花费几秒钟以上的操作时,请将操作分配给一个优先级低于正常的 worker 线程。

这样,主线程就可以处理新的用户命令,并且通过为 worker 线程分配更低的优先级,用户界面保持响应。

严格来说,本指南不会提高应用程序的速度,只会提高其响应能力。但是,用户会认为这是一种速度的提高。

多个工作线程

[编辑 | 编辑源代码]

在多核系统中,如果您可以将 CPU 密集型操作拆分为多个线程,请使用与处理器核心数量一样多的工作线程。

这样,每个核心都可以处理一个工作线程。如果分配的工作线程多于核心数量,结果将是繁重的线程切换,从而降低执行速度。主线程不会影响操作速度,因为它大多处于非活动状态。

此方法不适用于 I/O 绑定任务;调度所有等待同一磁盘的线程只会导致开销。但一个线程可以在另一个线程从磁盘读取时进行计算,因此在某些 I/O 绑定程序中,两个线程可以执行有用的工作。类似地,两个线程有时可以比一个线程更好地利用全双工网络链路。

使用多线程库

[编辑 | 编辑源代码]

如果您正在开发单线程应用程序,请不要使用仅为多线程应用程序设计的库。

用于使库线程安全的技术可能会产生内存和时间开销。如果您不使用线程,请避免支付它们的成本。

创建多线程库

[编辑 | 编辑源代码]

如果您正在开发库,请正确处理多线程应用程序对其的使用,但也针对单线程应用程序对其的使用进行优化。

用于使库线程安全的技术可能会产生内存和时间开销。如果您的库用户不使用线程,请避免强迫您的用户支付线程的成本。

仅当多个线程同时访问相同数据,并且至少其中一个访问是用于写入时,才使用互斥原语。

互斥原语有开销。

如果您确定在给定时间段内,没有线程写入某个内存区域,则无需同步对该区域的读取访问。

华夏公益教科书