ithreads have two problems:
1. When you spawn a thread, it copies the whole environment from the parent thread, variables and code. This results in poor performance when a lot of libraries are loaded.
2. You can't pass a file descriptor from one thread to the other. So you can't create a network server that spawns a thread for each client.
This makes perl one of the only scripting language you can't use to build a multi-threaded network server, without using fancy stuff like Coro, AnyEvent or POE. Those are great libraries, but they are clumsy compared to just spawning a thread with a function to call.
If we could fix #2, then you could spawn a server thread that sends FD to worker threads as it gets them.
Fixing #1 could be done by allowing spawning an empty thread, giving it a module, function name and arguments to call. The new thread would only load the module once spawned, not when perl starts.
Doing this would allow for Erlang style processes, which is basically what POE tries to do, except with a lot of mucking around with NOWAIT calls, and too many callbacks.