Ich hoffe, jemand kann mir helfen zu verstehen, warum der folgende Code die Ausgabe unten erzeugt. Der Code stammt aus dem Concurrency-Kapitel in Simon Marlows Buch (Link unten).`forkIO` und` putMVar`: Was passiert unter der Haube?
Basierend auf der Beschreibung der verschiedenen Funktionen ging ich davon aus, dass die zweite putMVar
Funktion blockiert werden sollte, da (i) beide putMVar
Funktionen Teil desselben Threads sind und (ii) ein Wert bereits zugewiesen wurde. Das ist eindeutig nicht der Fall. Es wäre schön zu verstehen, was hier "unter der Haube" vor sich geht.
. (Anmerkung: das Buch verwendet do
Notation, aber ich habe eine Vorliebe für >>=
Notation, wie ich es einfacher denken - daher die Version des Codes unten)
import Control.Concurrent
main :: IO()
main = newEmptyMVar >>=
\m -> forkIO (putMVar m 'x' >>= \_ -> putMVar m 'y') >>=
\_ -> takeMVar m >>=
print >>=
\_ -> takeMVar m >>=
print
Ausgabe der obige Code:
% ./mvar2
'x'
'y'