为什么多线程环境被认为是有害的?

时间:2009-12-22 05:35:33

标签: multithreading state

我理解如果一个人使用了很多范围广泛的状态,这是一个坏主意,但不可变计算和高度本地化的副作用怎么样?

6 个答案:

答案 0 :(得分:7)

调试多线程代码很难。真的很难。

虽然缓解状态,并且正确的设计可以减少这种困难,但仍然比调试单线程代码困难得多。

因此,多线程的多线程是一种设计病理。

话虽如此,有很多情况下使用> 1线程是正确的决定。

答案 1 :(得分:5)

为了过度简化,Erlang和Haskell等函数式语言是围绕多线程应用程序在消除副作用时非常安全的概念而构建的。你应该读一读这些。此外,通常,没有共享状态的多线程应用程序是非常安全的。

http://en.wikipedia.org/wiki/Haskell_%28programming_language%29

http://en.wikipedia.org/wiki/Erlang_%28programming_language%29

答案 2 :(得分:1)

多线程编程不被视为有害,但众所周知难以正确完成。有许多事情从第一眼看出来并不明显,可能导致死锁和竞争条件等事情。

不可变计算和函数编程是处理多线程编程复杂性的一种方法。随着多核系统在当今无处不在,人们普遍认为程序员不应该单独留在多线程环境中编程,而应该依赖于框架或库。在.NET环境中,并行扩展将成为框架的4.0版本的一部分。例如。

答案 3 :(得分:1)

许多人接近多线程,好像它是性能问题的银弹。例如,进行“计算密集型操作”的相对常见的情况,操作是无关紧要的。

一个常见的误解是,通过使操作多线程,我们可以加快它。具体情况要复杂得多。这取决于过程是什么以及过程中有多少“等待”。如果这个过程非常紧张,那么把它放到一个多线程的环境中最多可以加快它的速度,而且在大多数情况下它会使它变得相当慢。

还考虑了管理状态,管理线程交互以及线程引入的确定性问题。

当然列表从那里开始。

答案 4 :(得分:1)

C ++中的多线程很难,因为(除其他外):

  • 变量的每次修改都必须在关键部分内完成。从源代码的静态分析中很难看出哪个变量需要这样的锁定。
  • 关键部分的范围必须足够小以避免性能问题,但通常不可能为每个变量使用单独的关键部分,因为必须同时更新多个变量。
  • 必须按层次结构使用嵌套的关键部分。但是,在编译时可能存在的工具不存在。
  • 当出现错误时,由于时间问题,它们通常难以重现。因此,代码难以测试且难以调试。
  • 如果不手动设置断点,则无法单步执行异步函数调用,因为C ++没有内置的线程支持。

答案 5 :(得分:0)

您在单线程程序中使用的算法可能很容易扩展到多个线程,也可能不容易。

例如,如果您想进行多线程图像压缩,某些格式本身就是平铺的,因此您可以为每个图块分配一个线程,但是例如无损JPEG基于最近邻居预测,因此该值是最后一个像素可能依赖于它们之间的所有值,因此该算法不适合在多个线程之间进行划分。