⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 free.t

📁 source of perl for linux application,
💻 T
字号:
use strict;use warnings;BEGIN {    if ($ENV{'PERL_CORE'}){        chdir 't';        unshift @INC, '../lib';    }    use Config;    if (! $Config{'useithreads'}) {        print("1..0 # Skip: Perl not compiled with 'useithreads'\n");        exit(0);    }}use ExtUtils::testlib;use threads;BEGIN {    eval {        require threads::shared;        threads::shared->import();    };    if ($@ || ! $threads::shared::threads_shared) {        print("1..0 # Skip: threads::shared not available\n");        exit(0);    }    require Thread::Queue;    $| = 1;    print("1..29\n");   ### Number of tests that will be run ###}my $q = Thread::Queue->new();my $TEST = 1;sub ok{    $q->enqueue(@_);    while ($q->pending()) {        my $ok   = $q->dequeue();        my $name = $q->dequeue();        my $id   = $TEST++;        if ($ok) {            print("ok $id - $name\n");        } else {            print("not ok $id - $name\n");            printf("# Failed test at line %d\n", (caller)[2]);        }    }}### Start of Testing ###ok(1, 'Loaded');# Tests freeing the Perl interperter for each thread# See http://www.nntp.perl.org/group/perl.perl5.porters/110772 for detailsmy ($COUNT, $STARTED) :shared;sub threading_1 {    my $q = shift;    my $tid = threads->tid();    $q->enqueue($tid, "Thread $tid started");    my $id;    {        lock($STARTED);        $STARTED++;        $id = $STARTED;    }    if ($STARTED < 5) {        sleep(1);        threads->create('threading_1', $q)->detach();    }    if ($id == 1) {        sleep(2);    } elsif ($id == 2) {        sleep(6);    } elsif ($id == 3) {        sleep(3);    } elsif ($id == 4) {        sleep(1);    } else {        sleep(2);    }    lock($COUNT);    $COUNT++;    cond_signal($COUNT);    $q->enqueue($tid, "Thread $tid done");}{    $STARTED = 0;    $COUNT = 0;    threads->create('threading_1', $q)->detach();    {        my $cnt = 0;        while ($cnt < 5) {            {                lock($COUNT);                cond_wait($COUNT) if ($COUNT < 5);                $cnt = $COUNT;            }            threads->create(sub {                threads->create(sub { })->join();            })->join();        }    }    sleep(1);}ok($COUNT == 5, "Done - $COUNT threads");sub threading_2 {    my $q = shift;    my $tid = threads->tid();    $q->enqueue($tid, "Thread $tid started");    {        lock($STARTED);        $STARTED++;    }    if ($STARTED < 5) {        threads->create('threading_2', $q)->detach();    }    threads->yield();    lock($COUNT);    $COUNT++;    cond_signal($COUNT);    $q->enqueue($tid, "Thread $tid done");}{    $STARTED = 0;    $COUNT = 0;    threads->create('threading_2', $q)->detach();    threads->create(sub {        threads->create(sub { })->join();    })->join();    {        lock($COUNT);        while ($COUNT < 5) {            cond_wait($COUNT);        }    }    sleep(1);}ok($COUNT == 5, "Done - $COUNT threads");{    threads->create(sub { })->join();}ok(1, 'Join');sub threading_3 {    my $q = shift;    my $tid = threads->tid();    $q->enqueue($tid, "Thread $tid started");    {        threads->create(sub {            my $q = shift;            my $tid = threads->tid();            $q->enqueue($tid, "Thread $tid started");            sleep(1);            lock($COUNT);            $COUNT++;            cond_signal($COUNT);            $q->enqueue($tid, "Thread $tid done");        }, $q)->detach();    }    lock($COUNT);    $COUNT++;    cond_signal($COUNT);    $q->enqueue($tid, "Thread $tid done");}{    $COUNT = 0;    threads->create(sub {        threads->create('threading_3', $q)->detach();        {            lock($COUNT);            while ($COUNT < 2) {                cond_wait($COUNT);            }        }    })->join();    sleep(1);}ok($COUNT == 2, "Done - $COUNT threads");# EOF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -