मैं GHC latest docs में MVAr उदाहरण समझने की कोशिश कर रहा हूँ -सहायता हास्केल
putSkipChan
जैसे कार्य कर रहे हैं -data SkipChan a = SkipChan (MVar (a, [MVar()])) (MVar()) newSkipChan :: IO (SkipChan a) newSkipChan = do sem <- newEmptyMVar main <- newMVar (undefined, [sem]) return (SkipChan main sem) putSkipChan :: SkipChan a -> a -> IO() putSkipChan (SkipChan main _) v = do (_, sems) <- takeMVar main putMVar main (v, []) mapM_ (sem -> putMVar sem()) sems getSkipChan :: SkipChan a -> IO a getSkipChan (SkipChan main sem) = do takeMVar sem (v, sems) <- takeMVar main putMVar main (v, sem:sems) return v dupSkipChan :: SkipChan a -> IO (SkipChan a) dupSkipChan (SkipChan main _) = do sem <- newEmptyMVar (v, sems) <- takeMVar main putMVar main (v, sem:sems) return (SkipChan main sem)
मैं कार्यक्रम का सबसे समझते हैं लेकिन दो प्रश्नों के लिए परमाणु? ऐसा लगता है कि पहले
takeMVar
करputMVar
पर अवरुद्ध होने से बचें। लेकिनtakeMVar
के बादputMVar
के बादputMVar
पर कुछ और कॉल करने में विफल नहीं होगा? ऐसे मामलों में, ऐसा लगता है कि कार्यक्रम हमेशा के लिए ब्लॉक होगा।dupSkipChan
sem
SkipChan
में सेमफोरों की सूची में क्यों संलग्न करता है? ऐसा नहीं हैgetSkipChan
द्वारा किया गया है। ऐसा लगता है किdupSkipChan
परgetSkipChan
(जो आपको लगता है कि है, तो एकाधिक पाठक होने के लिए)putSkipChan
एक ही सेमफोर को दो बार उठाने का प्रयास करता है?