【发布时间】:2020-12-30 15:47:27
【问题描述】:
我试图了解 GHC Haskell 如何在线程之间同步“基本”值(即不是 IORef、TVar 等)的计算。我搜索了这方面的信息,但没有找到任何明确的信息。
以下面的示例程序为例:
import Control.Concurrent
expensiveFunction x = sum [1..x] -- Just an example
val = expensiveFunction 12345
thread1 = print val
thread2 = print val
main = do
forkOS thread1
forkOS thread2
我了解值 val 最初将由未评估的闭包表示。为了打印 val,程序必须首先评估它。一旦评估了顶级绑定,就不需要再次评估它。
-
“val”的表示是否由不同的线程共享?
-
如果由于某种原因thread1首先完成了求值,它能否通过交换指针将最终计算值传递给thread2?那将如何同步?
-
如果线程 1 忙于评估线程 2 何时需要该值,线程 2 是等待它完成还是他们都争先恐后地评估它?
【问题讨论】: