Short-circuit limitedParallelism for K/N multi-worker dispatcher (#4118)

diff --git a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
index 919430c..cd40501 100644
--- a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
+++ b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
@@ -77,7 +77,7 @@
 
 private class MultiWorkerDispatcher(
     private val name: String,
-    workersCount: Int
+    private val workersCount: Int
 ) : CloseableCoroutineDispatcher() {
     private val tasksQueue = Channel<Runnable>(Channel.UNLIMITED)
     private val availableWorkers = Channel<CancellableContinuation<Runnable>>(Channel.UNLIMITED)
@@ -140,6 +140,15 @@
         }
     }
 
+    @ExperimentalCoroutinesApi
+    override fun limitedParallelism(parallelism: Int, name: String?): CoroutineDispatcher {
+        parallelism.checkParallelism()
+        if (parallelism >= workersCount) {
+            return namedOrThis(name)
+        }
+        return super.limitedParallelism(parallelism, name)
+    }
+
     override fun close() {
         tasksAndWorkersCounter.getAndUpdate { if (it.isClosed()) it else it or 1L }
         val workers = workerPool.close() // no new workers will be created