URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7589
[ Назад ]

Исходное сообщение
"Проблема с тридами. (/usr/bin/perl: double free or corruption (!prev))"

Отправлено mthawk , 14-Сен-08 14:39 
Доброго времени суток.
Использую threads
Порождаю новый трид $NET_THREAD=threads->create("netdaemon");
В процессе работы может возникнуть необходимость завершить трид....

Делаю это посылкой ему сигнала INT.
$NET_THREAD->kill('INT');
$NET_THREAD->join;
В триде в свою очередь определен обработчик сигнала
$SIG{INT}=sub
        {
        $socket->close;
        unlink NETDAEMONSOCK;
        threads->exit();
        };

.... и запустить его заново
$NET_THREAD=threads->create("netdaemon");

И все снова начинает работать. Но если завершается главный(материнский) процесс, делает он это со следующим сообщением:

*** glibc detected *** /usr/bin/perl: double free or corruption (!prev): 0x0a8b21a8 ***
======= Backtrace: =========
/lib/libc.so.6[0x8b6e71]
/lib/libc.so.6(cfree+0x90)[0x8ba4b0]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_safesysfree+0x21)[0x5e6aae1]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pregfree+0x4b)[0x5e56a9b]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(perl_destruct+0xd07)[0x5e203c7]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/threads.so[0x1d23bb]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/threads.so(XS_threads_join+0x49c)[0x1d2e6c]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pp_entersub+0x40d)[0x5e8043d]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x1f)[0x5e7989f]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x5e19ffe]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_sv+0x5e6)[0x5e1e806]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_sighandler+0x228)[0x5e6cb58]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_despatch_signals+0xb7)[0x5e6c8f7]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x38)[0x5e798b8]
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(perl_run+0x2ee)[0x5e1f10e]
/usr/bin/perl(main+0x13e)[0x804921e]
/lib/libc.so.6(__libc_start_main+0xe0)[0x864f90]
/usr/bin/perl[0x8049021]
======= Memory map: ========
00110000-00111000 r-xp 00110000 00:00 0          [vdso]
00111000-00113000 r-xp 00000000 08:06 58885      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/PerlIO/scalar/scalar.so
00113000-00114000 rwxp 00001000 08:06 58885      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/PerlIO/scalar/scalar.so
00114000-00133000 r-xp 00000000 08:06 640729     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/DBI/DBI.so
00133000-00134000 rwxp 0001e000 08:06 640729     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/DBI/DBI.so
00134000-0013d000 r-xp 00000000 08:06 649186     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/List/Util/Util.so
0013d000-0013e000 rwxp 00008000 08:06 649186     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/List/Util/Util.so
0013e000-00141000 r-xp 00000000 08:06 58712      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Fcntl/Fcntl.so
00141000-00142000 rwxp 00002000 08:06 58712      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Fcntl/Fcntl.so
00142000-00148000 r-xp 00000000 08:06 679494     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Time/HiRes/HiRes.so
00148000-00149000 rwxp 00005000 08:06 679494     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Time/HiRes/HiRes.so
00149000-0014c000 r-xp 00000000 08:06 58696      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Digest/MD5/MD5.so
0014c000-0014d000 rwxp 00003000 08:06 58696      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Digest/MD5/MD5.so
0014d000-00151000 r-xp 00000000 08:06 679640     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IO/IO.so
00151000-00152000 rwxp 00003000 08:06 679640     /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IO/IO.so
00152000-00157000 r-xp 00000000 08:06 58888      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Socket/Socket.so
00157000-00158000 rwxp 00004000 08:06 58888      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/Socket/Socket.so
00158000-00167000 r-xp 00000000 08:06 679773     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/WWW/Curl/Curl.so
00167000-00168000 rwxp 0000f000 08:06 679773     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/WWW/Curl/Curl.so
00168000-001a8000 r-xp 00000000 08:06 604138     /usr/lib/libcurl.so.4.0.0
001a8000-001a9000 rwxp 00040000 08:06 604138     /usr/lib/libcurl.so.4.0.0
001a9000-001ab000 r-xp 00000000 08:06 10268      /usr/lib/gconv/KOI8-R.so
001ab000-001ad000 rwxp 00001000 08:06 10268      /usr/lib/gconv/KOI8-R.so
001ad000-001c9000 r-xp 00000000 08:06 58726      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/POSIX/POSIX.so
001c9000-001ca000 rwxp 0001b000 08:06 58726      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/POSIX/POSIX.so
001ca000-001cd000 r-xp 00000000 08:06 630801     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/Device/SerialPort/SerialPort.so
001cd000-001ce000 rwxp 00002000 08:06 630801     /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/Device/SerialPort/SerialPort.so
001ce000-001d8000 r-xp 00000000 08:06 58923      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/threads.so
001d8000-001d9000 rwxp 00009000 08:06 58923      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/threads.so
001d9000-001e2000 r-xp 00000000 08:06 58922      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/shared/shared.so
001e2000-001e3000 rwxp 00009000 08:06 58922      /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/shared/shared.so
001e3000-001f5000 r-xp 00000000 08:06 649093     /usr/lib/perl5/site_perl/5.8.8/i386-lАварийный останов


В чем может быть проблема?


Содержание

Сообщения в этом обсуждении
"..."
Отправлено BigHo , 15-Сен-08 14:39 
если работать таким образом (с использованием сигналов), то лучшим выбором бы освободить главный поток от любой работы с сигналами, т.е. их игнорировать, и заставить выполнять самую легкую работу, где нельзя ошибится - в цикле pause или еще чего.

Это связано не столько с языком программирования, сколько самой многопоточностью в POSIX ОС - логика всей программы сильно усложняется при одновременном использовании сигналов и потоков. Если функция обработки сигнала сама по себе проста (например: установка глобальной переменной, которую опрашивает в цикле один или несколько потоков), то это еще будет работать стабильно. Пытаться управлять многопоточной программой не будет лучшим выбором.


"..."
Отправлено NuINu , 15-Сен-08 16:35 
я посмотрел perldoc threads


BUGS
       Parent-Child threads.
           On some platforms it might not be possible to destroy "parent" threads while there are still existing child "threads".

           This will possibly be fixed in later versions of perl.

думаю это отвечает на ваш вопрос.


"..."
Отправлено mthawk , 16-Сен-08 10:51 
On
>some platforms it might not be possible to destroy "parent" threads
>while there are still existing child "threads".
>
>           This
>will possibly be fixed in later versions of perl.
>
>думаю это отвечает на ваш вопрос.

Здравствуйте.
Остается непонятным - почему при первом запуске трида останов главного процесса проходит нормально. А если перезапусить трид - крашит.
Но скорее всего это действительно отвечает на вопрос.
Спасибо за участие.