● 更复杂的设计
● 上下文切换的开销
从单线程应用程序到多线程应用程序不仅会带来好处。 它也有一些代价。 不要仅仅因为可以使用多线程,你就启用多线程应用程序。 您应该有充分的理由,期望这样做所带来的收益大于代价。 如有疑虑,请尝试评估应用程序的性能或响应能力,而不仅仅是猜测。
更复杂的设计
尽管多线程应用程序的某些部分比单线程应用程序简单,但其他部分则更复杂。 由多个线程访问共享数据执行的代码需要特别注意。 线程交互远非总是那么简单。 不恰当的线程同步引起的错误很难被检测、重现和修复。
上下文切换的开销
当CPU的执行,从一个线程切换到另外一个线程时,CPU需要保存当前线程的本地数据、程序指针等,并加载要执行的下一个线程的本地数据、程序指针等。 此切换称为“上下文切换(context switch)”。 即,CPU从在一个线程的上下文中执行,切换为在另一个线程的上下文中执行。
上下文切换并不廉价。 你不应该在线程之间进行不必要的切换。
您可以在百度百科上阅读有关上下文切换的更多信息(原文是链接到维基百科去的,但在国内无方便访问,因此改为了百度百科和知乎上的一篇比较有意思的文章,有条件的也可以直接到维基百科输入“Context switch”关键字查询):
增加资源的消耗
线程需要计算机中的一些资源才能运行。 除了CPU时间外,线程还需要一些内存来保留其本地堆栈。 它还可能会占用操作系统中,管理线程所需的一些资源。 尝试创建一个程序,该程序创建的100个线程除了等待外什么都不做,并查看应用程序在运行时需要占用多少内存。
Jakob Jenkov
Last update: 2021-03-08