A simple thread pool using a shared queue to use if excessive forking is causing problems. Instead of [] fork you use [] queueWork And instead of getting a process back you get a worker that you can ask hasValue and value. hasValue doesn't block, value does.