代码之家  ›  专栏  ›  技术社区  ›  Mantas Vidutis

Haskell多线程有多困难?

  •  61
  • Mantas Vidutis  · 技术社区  · 16 年前

    我听说在Haskell中,创建多线程应用程序就像使用标准Haskell应用程序并使用 -threaded par 实际源代码中的命令。

    2 回复  |  直到 16 年前
        1
  •  66
  •   Don Stewart    16 年前

    Haskell多线程的状态如何?

    成熟。这个实现大约有15年的历史,事务性内存可以使用5年。GHC是一个广泛使用的编译器,有大量的开源支持和商业支持。

    把它引入程序有多容易?

    这取决于算法。有时它可以是一行的使用 par 以获得平行性。有时必须开发新的算法。一般来说,在Haskell中引入安全的并行性和并发性要比在典型语言中容易,而且性能良好。

    有没有一个好的多线程教程来介绍这些不同的命令及其用法?

    Haskell中有三种主要的并行和并发编程模型。

    • 隐式并行通过
    • 通过forkIO/mvar和软件事务内存实现显式并发和并行
    • 通过DPH库实现数据并行

    这些是最主要的。在任何情况下,您都可以使用多核运行时来使用-threaded进行编译,但将特定问题并行化的容易程度取决于您使用的算法,以及您从该列表中采用的并行编程模型。

    这里是 an introduction to the main parallel programming models in Haskell, 以及如何实现加速。

    我想 Chapter 24 of Real World Haskell

        2
  •  18
  •   ony    16 年前

    还有并发项。

    par b (f a b) b f 结果不需要它。

    不这样做的原因之一是每个函数都需要它的所有参数(比如 a+b (2*3)+(3*4) 因为你可以并行计算乘法。而且您可能会丢失一些缓存命中或类似的东西,或者在单处理器上执行这些操作时所做的优化(即,无论如何,您都需要将结果从一个处理器传递到另一个处理器)。

    当然是使用的代码 par 很难看,当您折叠列表或其他数据结构时,您可能需要计算轻元素的一些块,以确保开销/计算量非常小。你可以看看 parallel .

    还有数据并行Haskell(DPH)。

    如果你的程序更多的是关于IO monad,那么你肯定需要做很多改变。看到了吗 forkIO , Software Transactional Memory (STM) 还有很多来自 Concurrency category