如何确定按Ctrl + C后所有线程都被杀死了

时间:2017-10-13 03:31:07

标签: multithreading haskell ghci

我在 gchi 中运行了一个服务器服务器和另一个后台线程(通过async)。当我在GHCi提示符上按Ctrl+c时,服务方服务器正常关闭,但我的后台线程仍在运行。只退出整个GHCi会话似乎真的终止了它。

两个问题:

  • 这种行为只是因为我在GHCi?如果我编译了一个二进制文件,运行它,然后按下Ctrl + C就可以了,后台线程是否仍会继续运行?
  • 如何正确解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

这种行为只是因为我在GHCi吗?如果我编译了一个二进制文件,运行它,然后按下Ctrl + C就可以了,后台线程是否仍会继续运行?

在已编译的二进制文件中,如果^ C导致main线程结束,则进程将结束,并且所有线程也将(突然)结束为副作用。 ^ C不会导致main线程结束;请参阅下面的信号处理讨论。

  

如何妥善解决这个问题?

可能你可以捕获UserInterrupt异常以注意^ C被命中并关闭你在异常处理程序中生成的任何线程。

我说“可能”因为^ C处理有点复杂,并且servant安装了自定义处理程序是可行的。在这种情况下,您可能需要通过unix包查看signal handling。 (不知道Windows系统的等价物。)