\&thread_job($key, $device_ip{$key}, $index)
не делает то, что вы думаете, он делает: он сразу запускает thread_job(...)
, а затем выдает ссылку на свой результат.threads->new
затем пытается выполнить эту ссылку в новом потоке, что не работает, потому что это не ссылка на sub
.
Возможно, вы вместо этого хотите сказать sub { thread_job($key, $device_ip{$key}, $index) }
.(Или версия @ musiKk.)