Re: seg faults when i use thread->new from a thread - am i using threads incorrectly?
[email protected] (Arthur Bergman)
| Newsgroups | perl.ithreads |
|---|---|
| Message-ID | <[email protected]> |
On onsdag, apr 2, 2003, at 03:19 Europe/Stockholm, Bradley W. Langhorst
wrote:
>
> I just found this newsgroup - so I hope no one is annoyed that I'm
> posting
> something very similar to what i posted on c.l.p.m
>
Not at all, :)
>
> I'm seeing unusual problems when i try to start a new thread from a
> previously created thread.
>
This has been known to be a bit wonky on Win32, but not under unix
(which I assume you are using because you like forks.pm)
> I've written a INET socket program to respond to incoming messages with
> new
> messages sent out on a different socket.
>
> I start a new thread for every incoming request .
> When I don't need to spawn new threads the program works reliably.
> However, some incoming requests have to create multiple responses so
> I'm
> creating new threads...
>
> I get seg faults when that happens with some of my tests
>
> ./agent.pl
> Segmentation fault
> ./agent.pl
> Segmentation fault
>
A backtrace would be nice,,
gdb perl
run ./agent.pl
bt
> I also see leaked scalars when when it my test doesn't induce a seg
> fault
>
Probably the same thing.
> here's the code that creates the inner threads:
> Is there something wrong with this?
> (I was surprised to find that I could not return multiple values from a
> join
> - thus the array_ref and splice)
>
Because of some unknown reason the thread runs with the context of when
it is created, so to return an array you need to do
($thread) = threads->new(....
so the thread gets a list context
> foreach $subtask (@$ra_tasks) {
> log_msg("Trying to schedule $subtask asynchronously\n",10);
> #thread so these can occur simultaneously
> $thr = threads->new(\&schedule_task,
> $subtask,
> $earliest_start,
> $bid_by,
> $req_id);
> log_msg("adding thread $thr to list of workers\n", 12);
> push @workers, $thr;
> }
>
> #now gather the results from the workers
>
> foreach $thr (@workers) {
>
> eval {
> $ra_ret = $thr->join();
> };
> if ($@) {
> die("subcontracing failed: $@\n");
> } else {
> ($start_time,$end_time, $ra_bids) = splice(@$ra_ret,0,3);
>
> push @subtasks, {'first_start' => $start_time,
> 'last_end' => $end_time,
> 'bids' => $ra_bids};
> }
> }
>
Do you know when you are getting the coredump, in new() or in join?
Also, what modules are you using?
Arthur