我最近在开发一个通过以太网和串口发送和接收消息的应用程序.然后,我被要求添加对DIO离散度的监控.我通过,
"没有理由中断消息处理中涉及的主线程,我只是创建 另一个监视DIO的线程."
然而,这一决定被证明是不好的.有时,主线程将在发送和接收串行消息之间中断.这种中断会破坏时间,唉,消息会永远丢失.
我找到了另一种监控DIO 而不使用其他线程的方法,以太网和串行通信恢复了正常的功能.
然而,整个惨败让我思考.他们关于何时不使用多线程的任何一般指导和/或任何人在使用多线程时是否有任何情况的例子都不是一个好主意?
**编辑:根据您的意见,在为互联网提供信息后,我写了一篇博文,题为" 多线程何时不是一个好主意?
在单处理器计算机和桌面应用程序上,您使用多线程,因此您不会冻结应用程序,而是真正的其他任何东西.
在单处理器服务器和基于Web的应用程序上,不需要多线程,因为Web服务器处理大部分内容.
在多处理器计算机和桌面应用程序上,建议您使用多线程和并行编程.制作与处理器一样多的线程.
在多处理器服务器和基于Web的应用程序上,不再需要多线程,因为Web服务器会处理它.
总的来说,如果您使用多个线程而不是冻结桌面应用程序和任何其他通用答案,那么如果由于线程相互中断而导致您拥有单个核心计算机,则会使应用程序变慢.
为什么?因为硬件开关.硬件总是在线程之间切换需要时间.在一个多核盒子上,继续为每个核心使用1个线程,你会看到一个提升.
用一句旧话来解释:程序员遇到了问题.他想,"我知道,我会使用线程." 现在程序员有两个问题.(通常归因于JWZ,但似乎早于他使用它来谈论正则表达式.)
一个好的经验法则是"不要使用线程,除非有一个非常令人信服的理由使用线程." 多线程都在寻找麻烦.尝试在不使用多个线程的情况下找到解决问题的好方法,并且只有在避免使用线程时才会使用线程,这与使用线程的额外工作一样麻烦.此外,如果您在多核/多CPU计算机上运行,请考虑切换到多个线程,单线程版本的性能测试表明您需要额外核心的性能.
如果出现以下情况,多线程是一个坏主意:
几个线程访问和更新相同的资源(设置变量,写入文件),并且您不了解线程安全性.
几个线程相互交互,您不了解互斥体和类似的线程管理工具.
您的程序使用静态变量(线程通常默认共享它们).
您尚未调试并发问题.