#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Thread::Queue;
use Data::Dumper;
my @myarray = (1 .. 1000);
#print Dumper (\@myarray);die;
my $count = shift || 10;
print "Number of threads: $count\n";
my $q = Thread::Queue->new;
my @threads;
for (0 .. $count - 1)
{
push @threads, async {
while (defined (my $f = $q->dequeue))
{
some_process ($f);
}
};
}
for (@myarray)
{
$q->enqueue ($_);
}
# Tell workers they are no longer needed.
$q->enqueue (undef) for @threads;
# Wait for workers to end
$_->join for @threads;
print "Complete\n";
1;
sub some_process
{
my $element = shift;
my $tid = threads->self->tid;
#my $count = threads->list (threads::running);
#print "Running threads: $count\n";
print "Thread $tid started\n";
open my $F, '>>', $tid . '.txt';
print $F 'TID: ', $tid, ', element: ', $element, "\n";
close $F;
print "Thread $tid stopped\n";
}
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
use threads::shared;
# Создаём расшареную переменную
my @numbers:shared = (1..100);
# Задаём количество потоков
my $threads = shift || 10;
# Создаём потоки и кладём их обекты в массив
my @threads;
for (1..$threads) {
push @threads, threads->new(
sub {
while (@numbers) {
# Достаём данные из массива
# Предварительно заблокировава его для остальных потоков
my $number;
{
# Блокировка работает только в этом скоупе
lock(@numbers);
$number = shift(@numbers);
}
print 'Result: '.($number*10)."\n";
}
}
);
}
# Запускаем потоки привязав их к основному процессу
$_->join for (@threads);