use strict; use warnings; use threads; use feature 'say' ; use Fcntl qw(:flock); open(FILE, ">>/tmp/test.txt"); for(0..9) { threads->new(\&worker, $_); } $_->join for threads->list; sub worker { my $x = shift; my $locked; $locked = flock(FILE, LOCK_EX|LOCK_NB ); if( $locked ) { say "$x: lock acquired"; sleep 4; } else { say "$x: cannot acquire lock"; } flock( FILE, LOCK_UN ); print "$x: lock released\n"; return; } #### 0: lock acquired 1: lock acquired 2: lock acquired 3: lock acquired 4: lock acquired 5: lock acquired 6: lock acquired 7: lock acquired 8: lock acquired 9: lock acquired 0: lock released 1: lock released 2: lock released 3: lock released 4: lock released 5: lock released 6: lock released 7: lock released 8: lock released 9: lock released