Like
runIO, but in the event of an exception that causes an
exit, we don't shut down the system cleanly, we just exit. This is
useful in some cases, because the safe exit version will give other
threads a chance to clean up first, which might shut down the system
in a different way. For example, try
main = forkIO (runIO (exitWith (ExitFailure 1))) >> threadDelay
10000
This will sometimes exit with "interrupted" and code 0, because the
main thread is given a chance to shut down when the child thread calls
safeExit. There is a race to shut down between the main and child
threads.