Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: fork ()  (Прочитано 19284 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
jifu
Гость
« : 20-07-2013 10:48 » 

Приветствую... Не пойму, в чем дело? Почему не ветвится код? Вроде, как каждый раз новое значение должно быть, или, я чего не понимаю...
Код: (Perl)
#!/usr/bin/perl -w

sub rnd {
    return rand ()
}

use Parallel::ForkManager;
my $pm = Parallel::ForkManager -> new(3);

for (1..15) {
    $pm -> start and next;
    print rnd, "\n";
    sleep(2);
    $pm -> finish;
    $pm -> wait_all_children;
}

У меня тут один и тот же процесс что ли шпарит???  Я шокирован!

C:\>c.pl
0.001251220703125
0.001251220703125
0.001251220703125
0.001251220703125
0.001251220703125
0.001251220703125
Terminating on signal SIGINT(2)
« Последнее редактирование: 20-07-2013 22:02 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-07-2013 22:08 » 

Почему ты так думаешь? Факты что говорят?


 Улыбаюсь
Цитата
start [ $process_identifier ]

    This method does the fork. It returns the pid of the child process for the parent, and 0 for the child process. If the $processes parameter for the constructor is 0 then, assuming you're in the child process, $pm->start simply returns 0.

    An optional $process_identifier can be provided to this method... It is used by the "run_on_finish" callback (see CALLBACKS) for identifying the finished process.
« Последнее редактирование: 20-07-2013 22:11 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
jifu
Гость
« Ответ #2 : 21-07-2013 03:53 » 

А почему тогда каждый раз одно и то же значение генерится? Вот как я это вижу, каждый раз новый процесс должен вызывать подпрограмму rnd, а у меня одно и то же, где же ветвление?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-07-2013 07:53 » 

jifu, вопрос-подсказка: как работает генератор псевдо-случайных чисел?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-07-2013 08:34 » 

Поддерживаю. Попробуй изменить строчку:

Код: (Perl)
print join(' ', $$, rnd, rnd, rnd), "\n";

В начале программы также вставь:

Код: (Perl)
print $$,  "\n";

И почитай мануалы:

perldoc -f rand
perldoc -f srand

И ошибка с wait_all_children: дочерний процесс завершится ранее, а в родительском это выполнено не будет.
« Последнее редактирование: 22-07-2013 06:01 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
jifu
Гость
« Ответ #5 : 22-07-2013 19:40 » 

Странно все это

C:\>c.pl
1916
-1568 0.001251220703125 0.563568115234375 0.19329833984375
-3048 0.001251220703125 0.563568115234375 0.19329833984375
-3156 0.001251220703125 0.563568115234375 0.19329833984375
-3532 0.001251220703125 0.563568115234375 0.19329833984375
-4032 0.001251220703125 0.563568115234375 0.19329833984375
-3964 0.001251220703125 0.563568115234375 0.19329833984375
-948 0.001251220703125 0.563568115234375 0.19329833984375
-3920 0.001251220703125 0.563568115234375 0.19329833984375
-1020 0.001251220703125 0.563568115234375 0.19329833984375
-1572 0.001251220703125 0.563568115234375 0.19329833984375
-2748 0.001251220703125 0.563568115234375 0.19329833984375
-4048 0.001251220703125 0.563568115234375 0.19329833984375
-3068 0.001251220703125 0.563568115234375 0.19329833984375
-2600 0.001251220703125 0.563568115234375 0.19329833984375
-2648 0.001251220703125 0.563568115234375 0.19329833984375
Записан
jifu
Гость
« Ответ #6 : 22-07-2013 19:49 » 

А почему тогда с потоками такой бороды нету... Я к тому, что все дело в rand() и srand()

Код: (Perl)
#!/usr/bin/perl -w

sub rnd {
    return rand()
}

use threads;

for (1..10) {
    threads -> new(\ & main);

}

$_ -> join
for threads -> list;

sub main

{

    while (1) {

        print rnd, "\n";

        sleep(5);

    }
}

C:\>c.pl
0.8504638671875
0.640350341796875
0.022491455078125
0.49530029296875
0.7867431640625
0.62353515625
0.915008544921875
0.6611328125
0.939178466796875
0.138702392578125
Terminating on signal SIGINT(2)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 22-07-2013 23:12 » 

jifu, тогда кури ман дальше, обращая особое внимание на thread safe раздел rand и srand - до просветления.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
jifu
Гость
« Ответ #8 : 23-07-2013 02:36 » 

Да я по учебникам не особо, я это, практик, во... Пусть и говнокод, но понятно чтобы было...  Я шокирован!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 23-07-2013 03:50 » 

Значить изучать не хочешь, а конкуренцию изучающим составлять хочешь? Нафига оно нам? Улыбаюсь
Намеки были даны. Задачка элементарна.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
jifu
Гость
« Ответ #10 : 24-07-2013 10:04 » 

Значить изучать не хочешь, а конкуренцию изучающим составлять хочешь? Нафига оно нам? Улыбаюсь
Намеки были даны. Задачка элементарна.
Да, не, какая там конкуренция... Мне теоретически не ясна разница при распараллеливании задачи, при потоках все пучком, при процессах - неясно. В манах же все на буржуйском, с тех. англ. мы на "ты"...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 24-07-2013 10:34 » 

Хрен поймешь, что ты хочешь сказать: то ли ты читаешь английские доки, то ли не читаешь.

Ты и правда не понимаешь? Что у процессов различное, оно же у потоков общее?

Чтобы заниматься практикой надо знать теорию. Иначе ничем хорошим это не кончится.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
jifu
Гость
« Ответ #12 : 24-07-2013 13:16 » 

Хрен поймешь, что ты хочешь сказать: то ли ты читаешь английские доки, то ли не читаешь.
Читаю конечно, как же иначе ориентироваться, другое дело, что там специфика своя, тех. англ. нас в школе не учили, а потом как-то было не до того...

Ты и правда не понимаешь? Что у процессов различное, оно же у потоков общее?
Да я понял уже намек, все в порядке, RXL. Будем курить маны и штурмовать гугл... Вся беда в том, что по человечески никто не разбирается, один напишет раз в месяц постовой и все у него нещадно дерут и муссируют... В русско-язычной части гугла толку нету. Интереснее, когда смотришь у буржуинов, там и решения дают интересные, да только по ихнему то мы не базлакам, че не ясно, спросить опять не у кого...


Чтобы заниматься практикой надо знать теорию. Иначе ничем хорошим это не кончится.
А как же тогда Ломоносов, Эйнштейн из двоек не вылазил... Это чистые практики...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 24-07-2013 13:29 » 

jifu, чтобы понять разницу между процессами и потоками, нужно искать не примеры на сомнительных сайтах, а вузовские лекции по курсу операционных систем. А затем сделать выводы относительно работы тех или иных системных функций в тех или иных условиях.

Но воспроизводить тексты лекций здесь в теме на форуме - это явно перебор. Сомневаюсь, что тут у нас такой герой найдётся. Поэтому пока ты с этим не разберёшься, здесь предметно говорить вроде бы и не о чем.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 24-07-2013 19:57 » 

jifu, если хочется пофлудить, есть раздел общения.

Понимаешь, из твоих слов не понятно ничего: воды много, но по теме ничего. Вроде как ты за помощью пришел. Задачка очень простая, значит тебя нужно направить, а не подсказывать. Подсказок ты не понимаешь. Что прикажешь делать?

Искал в Гугле и не нашел? Значит не то искал. Намек дан несколько раз: твоя задача решается через понимание двух вещей: работы генератора псевдослучайных чисел и основного различия потоков и процессов. Если не можешь понять, то пора менять подход к делу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines