POE's "thread-safety" depends on how you intend to use iThreads with
POE.

For example, programs cannot run entire POE::Session instances in
threads other than the one where POE::Kernel is dispatching events.
Perl won't permit the sub-threads to call POE methods in the parent
thread.

This may be worked around by treating iThreads as a variation of
subprocesses. That is, iThreads may be spawned to handle "sidecar"
tasks, and information may be exchanged with the thread running POE.

This is essentially how multiprocessing works, so most developers use
fork(), POE::Wheel::Run, POE::Component::Generic, or some other form
of multiprocessing instead of bothering with iThreads. Subprocesses
tend to use far less memory and run about the same speed as iThreads,
so there's not much loss in doing so. fork() is always enabled, but
iThreads must be compiled into Perl.