我为什么要使用线程而不是使用进程?

时间:2009-03-06 06:02:10

标签: multithreading process

将程序的不同部分分成不同的进程似乎(对我来说)制作一个更优雅的程序而不仅仅是线程化所有东西。在什么情况下,让事情在线程上运行而不是将程序分成不同的进程是有意义的?我什么时候应该使用线程?


修改

关于如何(或者如果)他们对单核和多核的不同行为的任何事情也会有所帮助。

8 个答案:

答案 0 :(得分:72)

您更喜欢多个进程的多个线程,原因有两个:

  1. 线程间通信(共享数据等)的编程比进程间通信简单得多。
  2. 线程之间的上下文切换比进程之间的快。也就是说,操作系统停止一个线程并开始运行另一个线程比使用两个进程执行相同操作更快。
  3. 示例:

    使用GUI的应用程序通常使用一个线程用于GUI,其他用于后台计算。例如,MS Office中的拼写检查程序是一个与运行Office用户界面的线程不同的线程。在这样的应用程序中,使用多个进程会导致性能降低,代码难以编写和维护。

答案 1 :(得分:32)

除了使用线程过程的优点之外,例如:

优点:

  • 创建线程要快得多 一个过程。
  • 更快切换 线程之间比切换 进程之间。
  • 线程共享数据 容易

考虑一些缺点:

  • 线程之间没有安全性。
  • 一个线程可以踩到另一个线程 数据。
  • 如果一个线程阻塞,全部 任务块中的线程。

至于你问题的重要部分“我什么时候应该使用线程?”

那么你应该考虑一些线程不应该改变程序语义的事实。他们只是改变了操作的时间。因此,它们几乎总是被用作与性能相关的问题的优雅解决方案。以下是您可能使用线程的一些示例:

  • 进行冗长的处理:当Windows应用程序正在计算时,它无法再处理任何消息。因此,无法更新显示。
  • 进行后台处理:有些 任务可能不是时间关键,但是 需要不断执行。
  • 执行I / O工作:I / O到磁盘或到 网络可能有不可预测性 延迟。线程允许您确保 I / O延迟不会延迟 申请的不相关部分。

答案 2 :(得分:6)

我假设你已经知道你需要一个线程或一个进程,所以我想说选择一个而不是另一个的主要原因是数据共享。

使用流程意味着您还需要进程间通信(IPC)来将数据输入和输出流程。如果要隔离这个过程,这是一件好事。

答案 3 :(得分:6)

你肯定听起来不像新手。这是一个很好的观察,在许多方面,流程更优雅。线程基本上是一种优化,以避免过多的转换或内存空间之间的过多通信。

表面上使用线程似乎也可以使程序更易于读写,因为您可以自由地在线程之间共享变量和内存。在实践中,这样做需要非常小心,以避免竞争条件或死锁。

有操作系统内核(最值得注意的是L4)非常努力地提高进程间通信的效率。对于这样的系统,人们可能会提出一个令人信服的论点,即线程毫无意义。

答案 4 :(得分:2)

除了其他答案之外,维护和部署单个进程要比拥有一些可执行文件简单得多。

可以使用多个进程/可执行文件来提供定义明确的接口/解耦,这样可以比在一个进程中保留所有功能更容易地重用或重新实现一个部分或另一部分。

答案 5 :(得分:2)

我同意上面的大部分答案。但是从设计的角度来讲,当我希望并行执行一组逻辑上相关的操作时,我宁愿选择一个线程。例如,如果你运行一个文字处理器,前台将有一个线程作为编辑器运行,而后台运行的其他线程会定期自动保存文档,因此没有人会设计一个进程来单独执行该自动保存任务。

答案 6 :(得分:0)

在此帖子中赞一下。有趣的讨论。但我感到有一点遗漏或间接指出。

由于所有这些原因,创建新流程的成本很高 必须分配和初始化的数据结构。将该流程细分为不同的控制线程,以在流程内部实现多线程。

使用线程或进程来实现目标取决于您的程序使用要求和资源利用率。

答案 7 :(得分:0)

我想用另一种方式回答。 “这取决于您的应用程序的工作方案和性能SLA”将是我的答案。

例如,线程可能共享相同的地址空间,并且线程之间的通信可能更快,更容易,但是在某些情况下,线程可能会死锁,然后您认为进程会发生什么。

即使您是编程天才,并且使用了所有奇特的线程同步机制来防止死锁,但除非遵循确定性模型,否则肯定不是火箭科学,因为在Real上运行的硬实时系统可能会遇到这种情况您可以在一定程度上控制线程优先级的时机操作系统,并且可以期望操作系统遵守这些优先级,而Windows之类的通用操作系统可能并非如此。

从设计的角度来看,您可能也想将功能隔离到独立的自包含模块中,在这些模块中,它们可能实际上不需要共享相同的地址空间或内存,甚至不需要相互通信。在这种情况下,流程将很有意义。

以谷歌浏览器为例,与大多数使用多线程模型的浏览器不同,它会产生多个进程。 Chrome中的每个标签都可以与不同的服务器通信并呈现不同的网站。想象一下,如果一个网站停止响应,并且如果您因此而使线程停止运行,整个浏览器将变慢或停止,将会发生什么。 因此Google决定产生多个进程,这就是为什么即使一个标签页冻结了,您仍然可以继续使用Chrome浏览器的其他标签页的原因。

详细了解here
并且看起来here