in reply to data structure question

I'm not sure exactly where you're trying to reference the array value as a hash, but I suspect you're referencing it outside start_ftp. In start_ftp you set the array value to a hash:
$ftp_sessions[$nbr] = { status => 1, loc => $location };
But the following statement sets the same array value to a scalar reference:
$ftp_sessions[$nbr] = threads->create("start_ftp", $nbr, $loc);
Looks like a problem of overwriting your hash value from inside the function w/ a scalar ref when the function is returned.