文件forkIO说
GHC note: the new thread inherits the masked state of the parent (see mask).
The newly created thread has an exception handler that discards the exceptions
BlockedIndefinitelyOnMVar, BlockedIndefinitelyOnSTM, and ThreadKilled, and passes
all other exceptions to the uncaught exception handler.
Run Code Online (Sandbox Code Playgroud)
为什么子异常处理程序丢弃ThreadKilled?它们创建后两个线程之间是否存在某种连接?
当父线程死亡时究竟发生了什么?孩子是否得到任何例外?或者从孩子的角度来看,父母是否已经死亡?除了父线程停止运行之外还有其他事情发生吗?
我之所以这么说是因为在很多情况下我被迫在上下文中创建一个线程,我无法访问父级的范围.想象一下,你在某个库的深处,需要调用forkIO,并在父亲死亡时让那个线程死掉.是否有必要重组程序并将孩子传播ThreadId给父母并明确杀死它?或者还有其他解决方法吗?
在GHCi中进行调试或玩游戏时,我经常会碰巧知道实际的ThreadId数字(例如来自使用Debug.Trace),但这就是我所拥有的.
问题是所有线程API,例如killThread需要ThreadId而不是Int.
我已经尝试了Hoogle,但却出了问题.有没有办法做到这一点?我主要关心调试,所以我不介意它是一个讨厌的黑客,还是通过一个GHC专用库.