Starting a thread is relatively slow operation, which is why threads, used in the high-level abstractions, are not constantly created and destroyed. Rather than that, they are allocated from a thread pool.
All high-level abstractions are using the same thread pool,
GlobalParallelPool. It has public visibility – just in case you have to configure its parameters.
function GlobalParallelPool: IOmniThreadPool;