【发布时间】:2018-01-20 16:56:00
【问题描述】:
如果线程等待没有可能的生产者的MVar,GHC 通常足够聪明地抛出BlockedIndefinitelyOnMVar 并杀死线程。这种检测是如何实现的?
它是否检查所有对 MVar 的引用是否来自正在等待它的线程或类似的东西?
【问题讨论】:
标签: multithreading haskell ghc
如果线程等待没有可能的生产者的MVar,GHC 通常足够聪明地抛出BlockedIndefinitelyOnMVar 并杀死线程。这种检测是如何实现的?
它是否检查所有对 MVar 的引用是否来自正在等待它的线程或类似的东西?
【问题讨论】:
标签: multithreading haskell ghc
来自 Control.Concurrent:
GHC 尝试使用垃圾检测线程何时死锁 集电极。无法访问的线程(无法找到 跟随来自活动对象的指针)必须死锁,并且在这个 如果线程被发送异常。例外是 'BlockedIndefinitelyOnMVar', 'BlockedIndefinitelyOnSTM', “NonTermination”或“Deadlock”,具体取决于 线程死锁了。
请注意,此功能旨在用于调试,不应 依赖于您的程序的正确运行。没有 保证垃圾收集器将足够准确以检测 你的死锁,并且不能保证垃圾收集器会运行 足够及时的方式。基本上,与终结器相同的警告 适用于死锁检测。
死锁检测和 终结器(由 'Foreign.Concurrent.newForeignPtr' 或 “System.Mem.Weak”中的函数):如果线程被阻塞等待 终结器运行,则线程将被视为死锁并且 发送了异常。所以最好不要这样做,但如果你没有 替代然后可以防止线程被 通过使'StablePtr'指向它被认为是僵局。别 稍后忘记使用“freeStablePtr”释放“StablePtr”。
【讨论】: