use Thread::Semaphore qw( ); use threads::shared qw( ); BEGIN { *sema_down = \&Thread::Semaphore::down; *sema_up = \&Thread::Semaphore::up; } my $line_semi : shared = 0; ... sema_down(\$line_semi, 1); ... sema_up(\$line_semi, 1); #### use Thread::Semaphore qw( ); use threads::shared qw( is_shared ); BEGIN { package Thread::Semaphore; no warnings 'redefine'; sub new { my $class = shift; if (@_ && is_shared($_[0])) { return bless \$_[0], $class; } else { my $val : shared = @_ ? shift : 1; return bless \$val, $class; } } } my $line_semi_count : shared = 0; my $line_semi = Thread::Semaphore->new($line_semi_count); ... $line_semi->down(1); ... $line_semi->up(1);