मैंने इस छोटे से प्रोग्राम को बनाया जो लंबे समय से चलने वाले थंक बनाता है जो अंततः अपवाद के साथ विफल रहता है। फिर, एकाधिक धागे इसका मूल्यांकन करने का प्रयास करते हैं।यदि एक अपवाद में एक थंक परिणाम, तो थंक के परिणाम के रूप में अपवाद रखा जाता है?
import Control.Monad
import Control.Concurrent
import Control.Concurrent.MVar
main = do
let thunk = let p = product [1..10^4]
in if p `mod` 2 == 0 then error "exception"
else()
children <- replicateM 2000 (myForkIO (print thunk))
mapM_ takeMVar children
-- | Spawn a thread and return a MVar which can be used to wait for it.
myForkIO :: IO() -> IO (MVar())
myForkIO io = do
mvar <- newEmptyMVar
forkFinally io (\_ -> putMVar mvar())
return mvar
धागे की संख्या में वृद्धि स्पष्ट रूप से गणना है, जो पता चलता है कि एक असफल thunk परिणाम के रूप में अपवाद रखता है पर कोई प्रभाव नहीं है। क्या यह सच है? क्या यह व्यवहार कहीं भी दस्तावेज/निर्दिष्ट है?
अद्यतन:
forkFinally io (\e -> print e >> putMVar mvar())
करने के लिए forkFinally
लाइन बदलने की पुष्टि करता है कि प्रत्येक धागा अपवाद के साथ विफल रहता है।
अपवाद * अभिव्यक्ति का मान है। अभिव्यक्ति का मूल्यांकन कई बार कर सकता है? – Carl
@ करल मुझे संदेह है, लेकिन मैं निश्चित होना चाहता हूं। यह बार-बार मूल्य को पुन: सम्मिलित करने का भी प्रयास कर सकता है। –
मुझे जीएचसी आंतरिक पता है, अन्यथा मैं 'ghc-heap-view' जैसे टूल नहीं बना सका, इसलिए मुझे यकीन नहीं है कि आपको और क्या चाहिए। क्या आप कृपया अपने प्रश्न को स्पष्ट कर सकते हैं यदि मेरा उत्तर पर्याप्त सहायक नहीं है? –