You are aware that multi-threaded and Parallel::ForkManager aren't exactly synonymous. Multi-threaded tends to mean one process, actual threads, and data is shared between all of the threads.
P::F uses a new process for each instance through the loop (hence *Fork*Manager). Actions in one process do necessarily affect another -- say if 'discover' goes and finds something and saves the data in a global array.
Put a print statement as the operation in 'discover' and you may well find that it is indeed being run, and that it's just not doing what you think it's supposed to be doing.