xref: /openbsd-src/gnu/usr.bin/perl/dist/Thread-Semaphore/examples/semaphore.pl (revision f2a19305cfc49ea4d1a5feb55cd6c283c6f1e031)
1*f2a19305Safresh1#!/usr/bin/perl
2*f2a19305Safresh1
3*f2a19305Safresh1use strict;
4*f2a19305Safresh1use warnings;
5*f2a19305Safresh1
6*f2a19305Safresh1use threads;
7*f2a19305Safresh1use Thread::Semaphore;
8*f2a19305Safresh1
9*f2a19305Safresh1MAIN:
10*f2a19305Safresh1{
11*f2a19305Safresh1    # Create semaphore with count of 0
12*f2a19305Safresh1    my $s = Thread::Semaphore->new(0);
13*f2a19305Safresh1
14*f2a19305Safresh1    # Create detached thread
15*f2a19305Safresh1    threads->create(sub {
16*f2a19305Safresh1            # Thread is blocked until released by main
17*f2a19305Safresh1            $s->down();
18*f2a19305Safresh1
19*f2a19305Safresh1            # Thread does work
20*f2a19305Safresh1            # ...
21*f2a19305Safresh1
22*f2a19305Safresh1            # Tell main that thread is finished
23*f2a19305Safresh1            $s->up();
24*f2a19305Safresh1    })->detach();
25*f2a19305Safresh1
26*f2a19305Safresh1    # Release thread to do work
27*f2a19305Safresh1    $s->up();
28*f2a19305Safresh1
29*f2a19305Safresh1    # Wait for thread to finish
30*f2a19305Safresh1    $s->down();
31*f2a19305Safresh1}
32*f2a19305Safresh1
33*f2a19305Safresh1exit(0);
34*f2a19305Safresh1
35*f2a19305Safresh1# EOF
36