Haskell并发编程是否仍然限制在单个操作系统线程中?

6

在2005年的一篇研究论文中提到:

并发Haskell目前仅支持单处理器。运行时在单个操作系统线程内调度轻量级的Haskell线程。Haskell线程只在明确定义的“安全点”处被暂停;它们不能在任意时刻被抢占。

这种情况是否有所改变,或者并发Haskell仍然限制于单个操作系统线程?


3个回答

18

现在STM在多核上运行良好。并行实现首次在GHC 6.6中发布,采用一种细粒度的两阶段锁定策略;也就是说,在提交事务之前,实现首先尝试锁定涉及到的每个变量,然后提交更改,并最终解锁所有的变量。获取锁不会阻塞:如果锁已经被持有,则事务会中止并重试(这避免了通常的锁顺序反转死锁,如果锁获取是阻塞的话,则会出现死锁)。

这种STM实现显然并不是最快的——文献描述了许多可替代技术,可以获得更好的性能,但GHC的实现相对简单,并且不涉及任何全局锁(在操作不同变量集的事务之间不会干扰的情况下可以并行进行)。


6

那个链接在STM问题上有点不清楚。你有没有任何东西显示Concurrent Haskell的STM功能与其多核支持兼容? - Jonathan Allen
我认为没有任何东西会使它不兼容。我肯定已经在多个核心上使用了STM。 - GS - Apologise to Monica
STM的原始实现不兼容多核。但自从您发表评论后,我在其他地方读到它已经改为使用可行的实现方式。 - Jonathan Allen

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接