什么时候应该使用多线程?如果不同的线程执行相互独立的任务,那么多线程是否有益?



在昨晚被拒绝的面试中,这是我唯一答不上来的两个问题。

问:什么时候应该使用多线程?

A:你的问题很宽泛。很少有重要的系统可以简单、快速、可靠地使用一个线程来满足功能。举个例子:[挑选一个目标公司销售的典型系统,挑出其功能中可以更好地多线程化的几个方面——繁重的CPU、通信、多用户——只挑一些可能的。解释]。问:如果不同的线程执行相互独立的任务,那么多线程是否有益?

A:这取决于你所说的"执行任务"是什么意思。如果线程以并发方式处理相互独立的数据,那么多线程肯定是有益的——它减少了对锁的需求,死锁的概率随着锁的数量以超线性的方式增加。OTOH,线程执行相同的代码没有问题,这是安全和非常常见的。"

当你想要执行繁重的操作而不"阻塞"流时,你应该使用多线程。
在UI的例子中,你在后台线程中做了一个繁重的处理,但UI仍然是活动的。

如果线程执行互斥的任务,这是最好的,因为没有同步所需的线程开销

多线程是在程序中引入并行性的一种方法。在任何情况下,如果你的程序中可以有并行路径(不依赖于其他部分的结果的部分),你可以利用它。

特别是现在这些多核机器,这是一个应该利用的功能。

一些例子是处理大数据,你可以把它分成块并在多个线程中完成,文件处理,长时间运行的I/O工作,如网络数据传输等。

对于你的第二个问题,如果任务是相互独立的最好-原因

  • 没有共享数据意味着没有争用
  • 不需要任何有序的处理(依赖),所以每个线程可以在有资源时工作
  • 更容易实现

当您从主事件循环调用耗时的任务时,您绝对应该在GUI应用程序中使用多线程。这同样适用于在执行I/o时可能阻塞的服务器应用程序。

对于第二个问题,当您的机器具有多个CPU内核时,通常是肯定的。在这种情况下,这些独立的任务可以并行执行。

如果任务可以分解,可以并行执行,则可以使用多线程。就像生产和消费,验证和保存,读取和验证。

对于第二个问题,是的,如果一个程序在执行独立的任务,那么把它变成多线程是有益的。

这篇文章给出了很好的理由:https://marcja.wordpress.com/2007/04/06/four-reasons-to-use-multithreading/

总结起来,原因是:

    让你的程序保持响应。更好地利用你的CPU。CPU可能被IO或其他东西阻塞。当等待时,为什么不让其他线程使用它
  • 多个线程可以调度到多个CPU内核
  • 有些问题自然是要通过多线程来解决的。这样的解决方案可以简化代码。

通常,在执行时间受到CPU限制/瓶颈的情况下使用多线程,而不是在IO等其他领域。第二个问题是非常主观的。例如,如果它们相互独立,但都执行大量IO,那么您可能不一定会获得很大的增益。

当我们可以把工作分成几个独立的部分时,就使用多线程。例如,假设您必须执行一个复杂的数据库查询来获取数据,如果您可以将该查询划分为几个独立的查询,那么最好为每个查询分配一个线程并并行运行。这样,您的最终结果输出将更快。同样,这是一个当您有能力运行多个数据库查询时的示例。

回答你的第二个问题,最好为独立的任务设置线程。否则,您将不得不考虑同步、全局变量等问题。

什么时候应该使用多线程?

多线程是同时执行多个线程的过程。当你可以同时执行多个操作时,你应该使用多线程,这样可以节省时间。

如果不同的线程执行相互独立的任务,那么多线程是否有益?

通常是yes。如果不同的线程执行相互独立的任务,那么多线程通常是有益的,这样在单个线程中发生异常时不会影响其他线程。

最新更新