Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 什么时候多线程不是一个好主意?_Multithreading_Language Agnostic - Fatal编程技术网

Multithreading 什么时候多线程不是一个好主意?

Multithreading 什么时候多线程不是一个好主意?,multithreading,language-agnostic,Multithreading,Language Agnostic,我最近正在开发一个应用程序,它通过以太网和串口发送和接收消息。然后,我的任务是添加DIO离散的监控。我想 “没有理由打断主程序 消息中涉及的线程 正在处理,我将创建 另一个监视DIO的线程。” 然而,这一决定被证明是差劲的。有时主线程会在发送和接收串行消息之间中断。这种中断会中断计时,唉,消息将丢失(永远) 我找到了另一种不用另一个线程就能监控DIO的方法,以太网和串行通信都恢复到了正确的功能 然而,整个惨败让我思考他们是否有关于何时不使用多线程的一般指导原则和/或是否有人有更多关于使用多线程不

我最近正在开发一个应用程序,它通过以太网和串口发送和接收消息。然后,我的任务是添加DIO离散的监控。我想

“没有理由打断主程序 消息中涉及的线程 正在处理,我将创建 另一个监视DIO的线程。”

然而,这一决定被证明是差劲的。有时主线程会在发送和接收串行消息之间中断。这种中断会中断计时,唉,消息将丢失(永远)

我找到了另一种不用另一个线程就能监控DIO的方法,以太网和串行通信都恢复到了正确的功能

然而,整个惨败让我思考他们是否有关于何时不使用多线程的一般指导原则和/或是否有人有更多关于使用多线程不是一个好主意的情况的示例?


**编辑:根据你的评论,在浏览了互联网上的信息后,我写了一篇博客文章,题目是

实际上,多线程是不可扩展的,而且很难调试,所以如果你能避免的话,在任何情况下都不应该使用它。在少数情况下,它是强制性的:当多CPU上的性能很重要时,或者当您处理的服务器有很多客户端需要很长时间才能响应时


在任何其他情况下,您都可以使用队列+cron作业或其他替代方法。

在原则中,每次调用方在队列中等待时都没有开销。

进程是并行的吗?性能是一个真正的问题吗?在web服务器上是否有多个执行“线程”?我不认为有一个有限的答案。

如果您需要保证精确的物理定时(如您的示例中),多线程不是一个好主意。其他缺点包括线程之间密集的数据交换。我想说,如果你不太关心多线程的相对速度/优先级/时间,那么多线程对于真正的并行任务来说是很好的

  • 在单处理器计算机和桌面应用程序上,您可以使用多线程,这样您就不会冻结应用程序,而只需执行其他操作
  • 在单处理器服务器和基于web的应用程序上,不需要多线程,因为web服务器可以处理大部分线程
  • 在多处理器机器和桌面应用程序上,建议您使用多线程和并行编程。制造尽可能多的处理器线程
  • 在多处理器服务器和基于web的应用程序上,不再需要多线程,因为web服务器可以处理它
  • 总的来说,如果你在非冻结桌面应用程序和任何其他通用答案中使用多个线程,那么如果你有一台单核心机器,那么由于线程相互中断,你将使应用程序速度变慢


    为什么??因为硬件交换机。硬件在线程之间切换总共需要时间。在一个多核的盒子上,继续为每个核使用一个线程,你会看到一个很大的提升。

    套用一句老话:一个程序员有一个问题。他想,“我知道,我会使用线程。”现在程序员有两个问题。(通常归因于JWZ,但似乎早于他在谈论正则表达式时使用它。)


    一个好的经验法则是“不要使用线程,除非有非常令人信服的理由使用线程。”多个线程都在自找麻烦。在不使用多个线程的情况下,尝试找到一种解决问题的好方法,并且只有在避免使用线程和使用线程的额外工作一样麻烦的情况下,才使用线程。另外,如果你在多核/多CPU机器上运行,考虑切换到多线程,单线程版本的性能测试表明你需要额外内核的性能。

    < P>我最近写的应用程序必须使用多线程(虽然不是无限数量的线程)。我必须通过两个协议在多个方向上进行通信,并监控第三个资源的变化。两个协议库都需要一个线程来运行各自的事件循环,当考虑到这些事件循环时,很容易为资源监视创建第三个循环。除了事件循环要求外,通过线路的消息具有严格的定时要求,并且一个循环不会有阻塞另一个循环的风险,这通过使用多核CPU(SPARC)得到了进一步的缓解

    关于是否应该将每个消息处理视为从线程池中分配给线程的作业,还有进一步的讨论,但最终这是一个不值得做的扩展


    总而言之,如果可能的话,只有当您可以将工作划分为定义良好的作业(或一系列作业)时,才应该考虑线程,这样语义就相对容易记录和实现,并且您可以对您使用的和需要交互的线程数量设置上限。最适合应用此功能的系统几乎都是消息传递系统。

    我想说多线程通常用于:

  • 允许在后台处理数据,同时GUI保持响应
  • 将超大数据分析拆分为多个处理单元,以便更快地获得结果
  • 当您从某些硬件接收数据时,需要一些东西来不断地将其添加到缓冲区,而其他元素则决定如何处理它(写入磁盘、在GUI上显示等)
  • 因此,如果您没有解决其中一个问题,那么添加线程不太可能使您的生活更轻松。事实上,这几乎肯定会让事情变得更难,因为正如其他人所提到的;调试多线程应用程序比单线程解决方案要复杂得多

    安全性可能是避免使用多线程(在多个进程上)的一个原因。有关多进程safet的示例,请参见
    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