use threads::shared; my $semSO :shared; sub tprint { lock $sem; print @_; } sub tprintf { lock $sem; printf @_; } my $semSE :shared; sub twarn{ lock $semSE; print STDERR @_; } sub twarnf{ lock $semSE; printf STDERR @_; } ... tprint( $some, "Stuff" ); ... else twarnf( "%u %s\n", $this, $that );