代码之家  ›  专栏  ›  技术社区  ›  Pierreten

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

  •  0
  • Pierreten  · 技术社区  · 16 年前

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

    6 回复  |  直到 16 年前
        1
  •  7
  •   Kevin Montrose    16 年前

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

    虽然减轻了状态,适当的设计可以减少这一困难,但它仍然比调试单线程代码困难得多。

    尽管如此,在很多情况下,使用>1线程是正确的决定。

        2
  •  5
  •   danben    16 年前

    为了过分简化,Erlang和Haskell等函数式语言都是围绕这样一个概念构建的,即当消除副作用时,多线程应用程序是非常安全的。你应该看看这些。另外,一般来说,没有共享状态的多线程应用程序是非常安全的。

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

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

        3
  •  1
  •   kgiannakakis    16 年前

    多线程编程并不被认为是有害的,但众所周知很难正确完成。有很多事情一眼就看不出来,可能会导致僵局和比赛条件。

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

        4
  •  1
  •   GrayWizardx    16 年前

    很多人在处理多线程时,就好像它是解决性能问题的灵丹妙药一样。以一个相对常见的“计算密集型操作”为例,该操作是不相关的。

    一个常见的误解是,通过使操作多线程化,我们可以加快它的速度。这方面的细节要复杂得多。这取决于过程是什么以及过程中有多少“等待”。如果流程非常紧凑,那么将其放入多线程环境最多只能略微加快速度,并且在大多数情况下会使速度大大降低。

    还需要考虑管理状态、管理线程交互以及线程引入的决定论问题。

        5
  •  1
  •   Dimitri C.    16 年前

    C++中的多线程是困难的,因为(除其他事项外):

    • 关键部分的范围必须足够小,以避免性能问题,但对每个变量使用单独的关键部分通常是不可能的,因为必须同时更新多个变量。
    • 当bug出现时,由于时间问题,它们通常很难重现。因此,代码既难以测试,也难以调试。
        6
  •  0
  •   Pim    16 年前

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