LINUX.ORG.RU

Подскажите что тут не так?

 , ,


0

1

Всем привет.

Скажите, это только у меня, в кору падает такая штука, или так писать нельзя, тогда почему?

Спасибо.

#!/usr/bin/env perl
use warnings;
use strict;
use threads;

use AnyEvent;
use EV;

my $thr;

my $s2 = AnyEvent->signal(
        signal => "USR1",
        cb     => sub {
                        my $r = $thr->join();
                        print "r : " . dump(\$r) ."\n";
                }
        );

my $timer = AnyEvent->timer (
        interval => 300,
        after    => 0,
        cb       =>  \&timer_handler
);

sub timer_handler {
        $thr = threads->create(
                sub {
                        kill 'USR1', $$;
                        return  (1);
                }
        );
}

EV::loop;

так писать нельзя

Ты же написал, значит так писать можно.

тогда почему?

Встречный вопрос: почему так можно писать?

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Можешь объяснить что тут не так?

denisE
() автор топика

Тоже падает на my $r=$thr->join(), но перед этим успевает сказать:

perl: libev/ev.c:3700: ev_timer_stop: Проверочное утверждение «(«libev: internal timer heap corruption», (((loop)->timers) [active]).w == (WT)w)» не выполнено.

Вот так сразу ошибки не вижу, но треды вообще опасная штука. А разве нельзя подать знак главному потоку, как то еще, кроме сигналов?

disarmer ★★★
()
Ответ на: комментарий от disarmer

Угу...

Такая-же фигня.

Не знаю почему так происходит и что-то не могу понять что не так.

Решил вопрос по-другому, с использованием AnyEvent::Utuls::fork_call.

В моём случае, этот вариант, намного лучше и удобней.

denisE
() автор топика

Потоки на перле лучше не использовать. Пока они кривые, падают, и бешенно текут. Только форки.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Потоки на перле лучше не использовать.

ТС отлично продемонстрировал почему, написав кривой код, так и не научившись работать с потоками.

Только форки.

И интерпретатор собирать без поддержки тредов.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

И интерпретатор собирать без поддержки тредов.

Всегда собирал с поддержкой, из-за этого проблем не наблюдалось.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

из-за этого проблем не наблюдалось.

Аналогично. Отсутствие поддержки тредов - сдерживающий фактор.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

ТС отлично продемонстрировал почему, написав кривой код, так и не научившись работать с потоками.

А как нужно было написать?

denisE
() автор топика
Ответ на: комментарий от denisE

А как нужно было написать?

Сперва надо описать задачу, что конкретно (по мнению автора) делает этот код, какую проблему он решает.

Затем рассказать почему в коде много лишних конструкций: $timer, ipc основанный на отправке сигналов (а не threads api), какая версия интерпретатора и threads api.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Сперва надо описать задачу, что конкретно (по мнению автора) делает этот код, какую проблему он решает.

Хмм, наделся что будут отвечать люди которые понимают что тут написано...

А если не понимают, то мои описания не помогут.

Как сделать по-другому - знаю, не понимаю почему этот код не работает.

P.S. Ubuntu 14.04

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi (with 41 registered patches, see perl -V for more detail)

denisE
() автор топика
Ответ на: комментарий от denisE

Понимают, что написано конкрентно тут, но так как всеми ожидаемая libastral все еще в разработке, они не могут узнать, какая задача конкретно стоит, соответственно на вопрос «или так писать нельзя, тогда почему?» врядле тебе кто-то внятно ответит.

grouzen ★★
()
Ответ на: комментарий от grouzen

А при чём тут libastral ?

Есть код, что ещё нужно объяснить?

В любом случае код написан для тех кто может его прочитать, а кто не может, то скорее всего и не ответит...

denisE
() автор топика
Ответ на: комментарий от denisE

Все что я понял из этого кода: ты дергаешь таймер, который создает тред, который шлет USR1 текущему процессу, который ловит этот сигнал, ждет когда ранее запущенный тред завершится и после этого, ты сам явно падаешь в dump.

grouzen ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.