为什么我应该使用线程与使用进程?
把一个程序的不同部分分成不同的进程似乎(比方说)要制作一个更优雅的程序,而不仅仅是对所有东西进行线程化。 在什么情况下,让事情在一个线程上运行,而将程序分离到不同的进程中呢? 我应该什么时候使用线程?
编辑
任何关于如何(或者如果)他们在单核和多核上采取不同的行为也是有帮助的。
您更喜欢多个进程的多个线程,原因有二:
- 线程间通信(共享数据等)比程序间通信要简单得多。
- 线程之间的上下文切换比进程之间更快。 也就是说,操作系统停止一个线程并开始运行另一个线程比在两个进程中运行更快。
例:
使用GUI的应用程序通常使用一个线程用于GUI,而其他用于后台计算。 例如,MS Office中的拼写检查程序是与运行Office用户界面的单独的线程。 在这样的应用程序中,使用多个进程会导致性能下降,代码难以编写和维护。
除了使用线程结束的优点之外,例如:
优点:
- 创build一个线程比一个进程要快得多。
- 在线程之间切换比在进程之间切换要快得多。
- 线程轻松共享数据
也考虑到一些缺点:
- 线程之间没有安全性。
- 一个线程可以踩到另一个线程的数据。
- 如果一个线程阻塞,任务块中的所有线程。
至于你的问题的重要部分“我应该什么时候使用一个线程?”
那么你应该考虑一些线程不应该改变程序的语义的事实。 他们只是改变操作的时间。 因此,它们几乎总是被用作与性能相关问题的优雅解决scheme。 以下是可能使用线程的情况的一些示例:
- 做冗长的处理:当一个Windows应用程序正在计算它不能处理更多的消息。 因此,显示不能更新。
- 做后台处理:有些任务可能不是时间关键的,但需要连续执行。
- 做I / O工作:磁盘或networking的I / O可能会有不可预知的延迟。 线程允许您确保I / O延迟不会延迟应用程序的无关部分。
我假设你已经知道你需要一个线程或一个进程,所以我认为select一个的主要原因是数据共享。
使用stream程意味着您还需要进程间通信(IPC)来获取数据进出stream程。 如果这个过程是孤立的,这是一件好事。
你肯定听起来不像一个新手。 stream程在很多方面都更加优雅,这是一个很好的观察。 线程基本上是一个优化,以避免太多的转换或内存空间之间的太多通信。
从表面上看,使用线程也可能让你的程序更容易读写,因为你可以自由地在线程之间共享variables和内存。 在实践中,这样做需要非常小心的注意避免竞争条件或僵局。
有一些操作系统内核(最着名的是L4 )非常努力地提高进程间通信的效率。 对于这样的系统,人们可能会作出令人信服的论点,即线程是毫无意义的。
除了其他答案之外,维护和部署单个进程要比拥有一些可执行文件简单得多。
人们可以使用多个进程/可执行文件来提供一个定义良好的接口/解耦程序,从而使一个或另一个可以比一个进程中的所有function更容易被重用或重新实现。
我同意上面的大部分答案。 但从devise的angular度来讲,我宁愿去一个线程,当我想要一组逻辑上相关的操作进行并行。 例如,如果您运行文字处理器,将有一个线程作为编辑器在前台运行,另一个运行在后台的线程会定期自动保存文档,因此没有人会devise一个stream程来单独执行该自动保存任务。