Like
forkIO, this sparks off a new thread to run the
IO
computation passed as the first argument, and returns the
ThreadId of the newly created thread.
However,
forkOS creates a
bound thread, which is
necessary if you need to call foreign (non-Haskell) libraries that
make use of thread-local state, such as OpenGL (see
Control.Concurrent#boundthreads).
Using
forkOS instead of
forkIO makes no difference at
all to the scheduling behaviour of the Haskell runtime system. It is a
common misconception that you need to use
forkOS instead of
forkIO to avoid blocking all the Haskell threads when making a
foreign call; this isn't the case. To allow foreign calls to be made
without blocking all the Haskell threads (with GHC), it is only
necessary to use the
-threaded option when linking your
program, and to make sure the foreign import is not marked
unsafe.