Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > threads, semaphore


Автор: qw1mb0 3.12.2011, 23:51
Добрый день уважаемые форумчане.
Появилось необходимость написать программу:
Создается 3 параллельных потока которые генерируют массивы по 1000 символов:
Вроде как с этим разобрался:
Код


#!perl -w
use threads;
sub generate{
    my $arg = shift;
    for($i=0;$i<1000;$i++){
        $lol[$i] = int(rand 100);
    }
    print "thread ",$arg," \@lol = ",@lol,"\n";
    sleep 1;
}
my @threads;
for my $i(1..3){
    push @threads, threads->create(\&generate, $i);
}
foreach my $thread(@threads){
$thread->join();
}


Далее нужно создать еще 1 поток(4 поток), который будет искать среднее арифметическое одинаковых по индексу элементов массива, т.е. например 
(второй элемент массива из 1 потока + второй элемент массива из 2 потока)/2
Записывается в соответствующий массив. 

Далее: Создается еще 1 поток, который будет проворачивать ту же операцию с результатами 4 потока и 3 потока по аналогичной схеме сравнения первого и второго потоков.

Пока есть соображения только теоретические связанные с семафорами, уже битый час гуглю, но понять так и не могу как можно это реализовать.

Вот решил попросить помощи у вас.
Заранее спасибо большое за помощь.

Автор: DurRandir 4.12.2011, 20:03
1. use strict!
2. Зачем там sleep 1?
3. Вы пишите в массив, который не будет доступен извне потока. Читайте про :shared
4. Для решения надо понять простой факт - как только ->join для потока вернулся - это означает, что свою работу он выполнил. Этого вполне хватит, чтобы организовать линейное выполнение.

Автор: qw1mb0 4.12.2011, 22:44
DurRandir
1. Спасибо, что напомнили.
2. И вправду зачем?
3. Читаю и вроде как понял основные положения, НО я не могу понять:
я создаю 3 потока в цикле:
Код

my @threads;
for my $i(1..3){
    push @threads, threads->create(\&generate, $i);
}


Для решения моей задачи будет логично написать подпрограмму которая будет высчитывать среднее арифметическое и заносить это в новый массив для этого запускаем еще 1 поток. Но как можно обратиться именно к массивам @lol которые формируются в каждом отдельном потоке. 


Код

use strict;
use threads;
use threads::shared;
my @lol : shared;
sub generate{
    my $arg = shift;
    for(my $i=0;$i<100;$i++){
        $lol[$i] = int(rand 100);
    }
    print "thread ",$arg," \@lol = ",@lol,"\n";
}
my @threads;
for my $i(1..3){
    push @threads, threads->create(\&generate, $i);
}
foreach my $thread(@threads){
$thread->join();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)