Die folgende scheint zu funktionieren (wie in: es Surely tomorrow
jeder zweite hält sagen)
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Exception (evaluate)
main :: IO()
main = do
godot <- newEmptyMVar
forkIO $ do
g <- evaluate $ last [0..]
putMVar godot g
let loop = do
threadDelay $ 10^6
g <- tryTakeMVar godot
case g of
Just g -> return()
Nothing -> putStrLn "Surely tomorrow." >> loop
loop
Dies verwendet evaluate
, um sicherzustellen, last [0..]
tatsächlich zu WHFN gezwungen wird, bevor die MVar
Füllung - wenn ich ändern, um die Gabel Thread zu
forkIO $ do
let g = last [0..]
putMVar godot g
dann wird das Programm beendet.
Jedoch verwendet evaluate
seq
. Im Kontext der deterministischen Parallelität wird immer betont, dass seq
nicht ausreicht, um tatsächlich die Bewertungsreihenfolge zu garantieren. Tritt dieses Problem nicht in einem monadischen Kontext entstehen, oder soll ich besser
forkIO $ do
let g = last [0..]
g `pseq` putMVar godot g
die Compiler, um sicherzustellen, kann die Auswertung neu anordnen, so tryTakeMVar
vorzeitig erfolgreich ist?