代码之家  ›  专栏  ›  技术社区  ›  Petr

GHC如何识别线程被阻塞definitelyonMVAR?

  •  3
  • Petr  · 技术社区  · 7 年前

    如果线程等待 MVar 没有可能的制作人,GHC通常很聪明 BlockedIndefinitelyOnMVar 并终止线程。如何实现此检测?

    它是否检查对 MVar 是来自等待它的线程,还是类似的?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Carcigenicate    7 年前

    uses the garbage collector .

    来自控件。同时发生的:

    GHC尝试使用垃圾检测线程何时死锁 收藏家。无法访问的线程(无法通过 以下来自活动对象的指针)必须处于死锁状态 如果线程被发送异常。例外情况是 'BlockedDefiniteLyonMVAR','BlockedDefiniteLyonSTM', “非终止”或“死锁”,具体取决于 线程已死锁。

    请注意,此功能用于调试,不应 依赖于您的程序的正确运行。没有 确保垃圾收集器足够准确,可以检测 您的死锁,并且不能保证垃圾回收器将在 足够及时的方式。基本上,与终结器相同的注意事项 应用于死锁检测。

    死锁检测和 终结器(由“Foreign.Concurrent.newForeignPtr”或 “System.Mem.Weak”中的函数:如果线程在等待 若要运行终结器,则线程将被视为死锁,并且 发送了异常。所以最好不要这样做,但如果你没有 或者,可以防止线程 通过制作一个指向它的“StablePtr”被认为陷入僵局。不要 忘记稍后使用“freeStablePtr”释放“StablePtr”。