diff --git a/core-program.cabal b/core-program.cabal
--- a/core-program.cabal
+++ b/core-program.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           core-program
-version:        0.5.1.1
+version:        0.5.2.0
 synopsis:       Opinionated Haskell Interoperability
 description:    A library to help build command-line programs, both tools and
                 longer-running daemons.
diff --git a/lib/Core/Program/Threads.hs b/lib/Core/Program/Threads.hs
--- a/lib/Core/Program/Threads.hs
+++ b/lib/Core/Program/Threads.hs
@@ -26,6 +26,7 @@
 module Core.Program.Threads (
     -- * Concurrency
     forkThread,
+    forkThread_,
     waitThread,
     waitThread_,
     waitThread',
@@ -145,6 +146,17 @@
 
         return (Thread a)
 
+{-|
+Fork a thread with 'forkThread' but do not wait for a result. This is on the
+assumption that the sub program will either be a side-effect and over quickly,
+or long-running daemon thread (presumably containing a 'Control.Monad.forever'
+loop in it), never returning.
+
+@since 0.5.2
+-}
+forkThread_ :: Program τ α -> Program τ ()
+forkThread_ = void . forkThread
+
 {- |
 Wait for the completion of a thread, returning the result. This is a blocking
 operation.
@@ -297,8 +309,9 @@
 
 (this wraps __async__\'s 'Control.Concurrent.Async.cancel'. The underlying
 mechanism used is to throw the 'AsyncCancelled' to the other thread. That
-exception is asynchronous, so will not be trapped by a 'catch' block and will
-indeed cause the thread receiving the exception to come to an end)
+exception is asynchronous, so will not be trapped by a
+'Core.Program.Exceptions.catch' block and will indeed cause the thread
+receiving the exception to come to an end)
 
 @since 0.4.5
 -}
