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

dan*_*ine 43 multithreading process

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


编辑

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

Fre*_*ool 73

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

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

例:

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

  • 但是,数据共享是一个双面的硬币.您可以轻松搞乱其他线程的数据...... (3认同)
  • 速度优势也适用于多核吗?典型的操作系统通常允许这样做吗? (2认同)
  • 作为经验法则,您不应该尝试预测操作系统调度行为。您无法确定您的线程是在自己的不同内核上运行还是在同一个内核上运行。这同样适用于多个进程。所以不要指望这个多核的东西。 (2认同)
  • @Cannonade:“多线程对于*启动*可能是危险的”。您想要的更真实!我确定您的意思是“ * UN * -initiated”,但对于已启动的对象也很危险。 (2认同)

sim*_*rsh 34

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

好处:

  • 创建线程比处理更快.
  • 在线程之间切换比在进程之间切换要快得多.
  • 线程轻松共享数据

考虑一些缺点:

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

关于你的问题的重要部分"我什么时候应该使用一个线程?"

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

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

  • 你确定当1个线程阻塞时它们都会阻塞吗?你是什​​么意思?喜欢阻止等待I/O?你使用什么类型的线程?我知道PThreads不会阻止. (4认同)
  • 喜欢块等待资源.许多人讨厌它,但线程不是孤立的,因为它们没有自己的地址空间.线程导致的错误可能会终止整个进程或程序,因为该错误会影响该进程或程序中使用的所有线程的整个内存空间.块!! (3认同)

Ben*_*enB 6

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

使用流程意味着您还需要进程间通信(IPC)来获取进出流程的数据.如果要隔离这个过程,这是一件好事.


flo*_*din 6

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

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

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


pco*_*dex 5

我想换一种方式来回答这个问题。“这取决于您的应用程序的工作场景和性能 SLA”将是我的答案。

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

即使你是一个编程高手并且已经使用了所有花哨的线程同步机制来防止死锁,但除非遵循确定性模型,否则在实时操作系统上运行的硬实时系统可能就是这种情况,这肯定不是火箭科学您对线程优先级有一定程度的控制,并且可以期望操作系统尊重这些优先级,但对于像 Windows 这样的通用操作系统可能不是这种情况。

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

以 Google Chrome 为例,其中产生多个进程,而不是大多数使用多线程模型的浏览器。Chrome 中的每个选项卡都可以与不同的服务器通信并呈现不同的网站。想象一下,如果一个网站停止响应会发生什么,如果您的线程因此而停滞,整个浏览器要么变慢,要么停止。因此 Google 决定生成多个进程,这就是为什么即使一个选项卡冻结,您仍然可以继续使用 Chrome 浏览器的其他选项卡。

在这里阅读更多关于它的信息
,也看看这里