Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> threads, semaphore 
:(
    Опции темы
qw1mb0
Дата 3.12.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Добрый день уважаемые форумчане.
Появилось необходимость написать программу:
Создается 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 потока по аналогичной схеме сравнения первого и второго потоков.

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

Вот решил попросить помощи у вас.
Заранее спасибо большое за помощь.
PM MAIL ICQ Skype   Вверх
DurRandir
Дата 4.12.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. use strict!
2. Зачем там sleep 1?
3. Вы пишите в массив, который не будет доступен извне потока. Читайте про :shared
4. Для решения надо понять простой факт - как только ->join для потока вернулся - это означает, что свою работу он выполнил. Этого вполне хватит, чтобы организовать линейное выполнение.
PM   Вверх
qw1mb0
Дата 4.12.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



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();
}

PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.