Доброго времени суток.
Использую 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Аварийный останов
В чем может быть проблема?
если работать таким образом (с использованием сигналов), то лучшим выбором бы освободить главный поток от любой работы с сигналами, т.е. их игнорировать, и заставить выполнять самую легкую работу, где нельзя ошибится - в цикле pause или еще чего.Это связано не столько с языком программирования, сколько самой многопоточностью в POSIX ОС - логика всей программы сильно усложняется при одновременном использовании сигналов и потоков. Если функция обработки сигнала сама по себе проста (например: установка глобальной переменной, которую опрашивает в цикле один или несколько потоков), то это еще будет работать стабильно. Пытаться управлять многопоточной программой не будет лучшим выбором.
я посмотрел 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.
думаю это отвечает на ваш вопрос.
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.
>
>думаю это отвечает на ваш вопрос.Здравствуйте.
Остается непонятным - почему при первом запуске трида останов главного процесса проходит нормально. А если перезапусить трид - крашит.
Но скорее всего это действительно отвечает на вопрос.
Спасибо за участие.