I'm a bit unclear as to why this is marked dynamic, since it is not used with binding.  Can you explain why it might be better as an atom?  I'll wait on a response from @dirtyvagabond as well.

I think that, rather than using a semaphore, this might be better implemented with a modified version of pmap which takes the # of threads as an argument.