Two things came to my mind while reading your question:
Did you try LWP::Parallel? It might be just the right tool for your job
When working with threads, try to keep the number of global variables minimal, that is declare all variables with my where possible. Using strict helps you to detect cases where you forgot some declarations. Global variables have to be cloned for each threads, which consumes quite some memory.
Apart from that, using use strict; use warnings; also helps avoiding mistakes.