in reply to Thread::Queue locking question

Not sure if this is your bug but you should set the patterns in single quotes for the case they include spaces.
You could change your line:
my $exclude = join ' --exclude=', '', @{$self->{patterns}};
to:
my $exclude; $exclude .= sprintf q{ --exclude='%s'}, $_ foreach @{$self->{patterns} +};
or:
my $exclude = join '', (map " --exclude='$_'", @{$self->{patterns}});