package threads::Q; use strict; use warnings; use threads::shared; our $VERSION = '1.1.5'; sub new { my( $package, $size ) = @_; my @Q :shared; return bless [ \@Q, $size ], $package; } sub nq { my( $Q, $size ) = @{ shift() }; lock @$Q; for( @_ ) { cond_wait @$Q while @$Q > $size; push @$Q, $_; cond_signal @$Q; } return; } sub dq { my( $Q, $size ) = @{ shift() }; lock @$Q; cond_wait @$Q until @$Q; cond_signal @$Q; shift @$Q } sub cq { my( $Q, $size ) = @{ shift() }; scalar @$Q; } sub dq_nb { my( $Q, $size ) = @{ shift() }; return unless @$Q; lock @$Q; shift @$Q; }