Multithreading 什么时候多线程不是一个好主意?
我最近正在开发一个应用程序,它通过以太网和串口发送和接收消息。然后,我的任务是添加DIO离散的监控。我想 “没有理由打断主程序 消息中涉及的线程 正在处理,我将创建 另一个监视DIO的线程。” 然而,这一决定被证明是差劲的。有时主线程会在发送和接收串行消息之间中断。这种中断会中断计时,唉,消息将丢失(永远) 我找到了另一种不用另一个线程就能监控DIO的方法,以太网和串行通信都恢复到了正确的功能 然而,整个惨败让我思考他们是否有关于何时不使用多线程的一般指导原则和/或是否有人有更多关于使用多线程不是一个好主意的情况的示例?Multithreading 什么时候多线程不是一个好主意?,multithreading,language-agnostic,Multithreading,Language Agnostic,我最近正在开发一个应用程序,它通过以太网和串口发送和接收消息。然后,我的任务是添加DIO离散的监控。我想 “没有理由打断主程序 消息中涉及的线程 正在处理,我将创建 另一个监视DIO的线程。” 然而,这一决定被证明是差劲的。有时主线程会在发送和接收串行消息之间中断。这种中断会中断计时,唉,消息将丢失(永远) 我找到了另一种不用另一个线程就能监控DIO的方法,以太网和串行通信都恢复到了正确的功能 然而,整个惨败让我思考他们是否有关于何时不使用多线程的一般指导原则和/或是否有人有更多关于使用多线程不
**编辑:根据你的评论,在浏览了互联网上的信息后,我写了一篇博客文章,题目是实际上,多线程是不可扩展的,而且很难调试,所以如果你能避免的话,在任何情况下都不应该使用它。在少数情况下,它是强制性的:当多CPU上的性能很重要时,或者当您处理的服务器有很多客户端需要很长时间才能响应时
在任何其他情况下,您都可以使用队列+cron作业或其他替代方法。在原则中,每次调用方在队列中等待时都没有开销。进程是并行的吗?性能是一个真正的问题吗?在web服务器上是否有多个执行“线程”?我不认为有一个有限的答案。如果您需要保证精确的物理定时(如您的示例中),多线程不是一个好主意。其他缺点包括线程之间密集的数据交换。我想说,如果你不太关心多线程的相对速度/优先级/时间,那么多线程对于真正的并行任务来说是很好的
为什么??因为硬件交换机。硬件在线程之间切换总共需要时间。在一个多核的盒子上,继续为每个核使用一个线程,你会看到一个很大的提升。套用一句老话:一个程序员有一个问题。他想,“我知道,我会使用线程。”现在程序员有两个问题。(通常归因于JWZ,但似乎早于他在谈论正则表达式时使用它。)
一个好的经验法则是“不要使用线程,除非有非常令人信服的理由使用线程。”多个线程都在自找麻烦。在不使用多个线程的情况下,尝试找到一种解决问题的好方法,并且只有在避免使用线程和使用线程的额外工作一样麻烦的情况下,才使用线程。另外,如果你在多核/多CPU机器上运行,考虑切换到多线程,单线程版本的性能测试表明你需要额外内核的性能。 < P>我最近写的应用程序必须使用多线程(虽然不是无限数量的线程)。我必须通过两个协议在多个方向上进行通信,并监控第三个资源的变化。两个协议库都需要一个线程来运行各自的事件循环,当考虑到这些事件循环时,很容易为资源监视创建第三个循环。除了事件循环要求外,通过线路的消息具有严格的定时要求,并且一个循环不会有阻塞另一个循环的风险,这通过使用多核CPU(SPARC)得到了进一步的缓解 关于是否应该将每个消息处理视为从线程池中分配给线程的作业,还有进一步的讨论,但最终这是一个不值得做的扩展
总而言之,如果可能的话,只有当您可以将工作划分为定义良好的作业(或一系列作业)时,才应该考虑线程,这样语义就相对容易记录和实现,并且您可以对您使用的和需要交互的线程数量设置上限。最适合应用此功能的系统几乎都是消息传递系统。我想说多线程通常用于:
Per CPU [*] EVENTLOOP ------ Handles nonblocking I/O using OS/library utilities
| \___ Threadpool for various blocking events
Threadpool for handling the I/O messages that would take long