A mutex is not a thread, it is a bit of “state” shared across the threads that they use (with valid synchronization primitives) to ensure that only one thread at a time can “hold” the mutex (never forget to release it ). Remember that your coroutines can access shared state and can even have multiple instances running in parallel (started in different threads). A threadpool is just a way to reduce the parallelism (generally to the available computing resources), not normally to restrict the thread count to 1.