in reply to exit isn't killing children

As the documentation for fork states, you probably need to wait on the child processes (not threads; be careful with the terminology):

If you "fork" without ever waiting on your children, you will accumulate zombies. On some sys­tems, you can avoid this by setting "$SIG{CHLD}" to "IGNORE". See also the perlipc manpage for more examples of forking and reaping moribund children.