dan*_*ine 43 multithreading process
将程序的不同部分分成不同的过程似乎(对我而言)制作一个更优雅的程序,而不仅仅是线程化所有东西.在什么情况下,让事情在线程上运行而不是将程序分成不同的进程是有意义的?我什么时候应该使用线程?
关于它们如何(或者如果)对单核和多核采取不同行为的任何事情也会有所帮助.
Fre*_*ool 73
您更喜欢多个进程的多个线程有两个原因:
例:
使用GUI的应用程序通常使用一个线程用于GUI,其他用于后台计算.例如,MS Office中的拼写检查程序是一个与运行Office用户界面的线程不同的线程.在这样的应用程序中,使用多个进程会导致性能降低,代码难以编写和维护.
sim*_*rsh 34
除了使用线程过程的优点之外,例如:
好处:
考虑一些缺点:
关于你的问题的重要部分"我什么时候应该使用一个线程?"
那么你应该考虑一些线程不应该改变程序语义的事实.他们只是改变了操作的时间.因此,它们几乎总是被用作与性能相关的问题的优雅解决方案.以下是您可能使用线程的一些示例:
我假设你已经知道你需要一个线程或一个进程,所以我认为选择一个而不是另一个的主要原因是数据共享.
使用流程意味着您还需要进程间通信(IPC)来获取进出流程的数据.如果要隔离这个过程,这是一件好事.
我想换一种方式来回答这个问题。“这取决于您的应用程序的工作场景和性能 SLA”将是我的答案。
例如,线程可能共享相同的地址空间,线程之间的通信可能更快更容易,但也有可能在某些情况下线程死锁,然后您认为您的进程会发生什么。
即使你是一个编程高手并且已经使用了所有花哨的线程同步机制来防止死锁,但除非遵循确定性模型,否则在实时操作系统上运行的硬实时系统可能就是这种情况,这肯定不是火箭科学您对线程优先级有一定程度的控制,并且可以期望操作系统尊重这些优先级,但对于像 Windows 这样的通用操作系统可能不是这种情况。
从设计的角度来看,您也可能希望将您的功能隔离到独立的自包含模块中,在这些模块中它们可能不需要共享相同的地址空间或内存,甚至不需要相互通信。在这种情况下,流程是有意义的。
以 Google Chrome 为例,其中产生多个进程,而不是大多数使用多线程模型的浏览器。Chrome 中的每个选项卡都可以与不同的服务器通信并呈现不同的网站。想象一下,如果一个网站停止响应会发生什么,如果您的线程因此而停滞,整个浏览器要么变慢,要么停止。因此 Google 决定生成多个进程,这就是为什么即使一个选项卡冻结,您仍然可以继续使用 Chrome 浏览器的其他选项卡。