[fpc-devel] Exceptions in threads

Michael Van Canneyt michael at freepascal.org
Thu Dec 11 14:58:25 CET 2008



On Thu, 11 Dec 2008, Mattias Gärtner wrote:

> Zitat von Michael Van Canneyt <michael at freepascal.org>:
> 
> >
> >
> > On Thu, 11 Dec 2008, Mattias Gärtner wrote:
> >
> > > Zitat von Florian Klaempfl <florian at freepascal.org>:
> > >
> > > > Mattias Gärtner schrieb:
> > > > > I'm writing a unit to simplify parallel methods/procedures.
> > > > >
> > > > > For example:
> > > > >   DoParallel(@AMethod,StartIndex,EndIndex,Data);
> > > > >
> > > > > The AMethod is executed with several threads in parallel.
> > > > >
> > > > > What should happen when an exception occurs?
> > > > > It would be nice if the exception can be transfered to the main thread.
> > > > > Is this possible? How?
> > > >
> > > > See synchronize/checksynchronize implementation.
> > >
> > > Sorry, I misused the term 'main thread'.
> > >
> > > DoParallel starts AMethod with several threads in parallel and waits until
> > all
> > > threads finished. DoParallel can be called by any thread (e.g. the main
> > thread
> > > of the process *or* any other sub thread). Even the threads of the pool can
> > > call again DoParallel. This is only limited by the memory, as each call
> > creates
> > > a threadgroup object.
> > >
> > > The goal is to simplify parallelizing procedures so for the user DoParallel
> > > should work like a normal procedure call.
> > > That's why it would be nice if the following could work:
> > >
> > > try
> > >   ...
> > >   DoParallel(...);
> > >   ...
> > > except
> > > end;
> > >
> > > The exception can occur in any of the subthreads including the starting
> > thread
> > > (which I named 'main thread', because it is the main thread of the group.
> > Maybe
> > > I should call it 'group thread' or 'starter thread').
> > >
> > > When an exception occurs, the group waits for all other threads of this
> > group to
> > > finish and then the exception should happen 'as if the exception occured in
> > the
> > > starting thread'.
> >
> > The way I uderstand threads this can never work, because then there should
> > be a synchronization wait loop after the doparallel.  Without the wait loop
> > it'll never work, because where (at which statement) should the exception be
> > raised ?
> 
> It should be raised in the starter thread. The question is how to
> - stop an exception in a thread (try..except)
> - give it to another thread - the starter thread (giving the object is easy, but
> ...)
> - continue the helper thread (this will normally free the exception object, I
> need a way to avoid this automatism)
> - raise the exception in the starter thread (raise FetchedException).

This is the problem: At which point should this be done ? 

Can you point at the statement where it should be raised in the following
code:

 try
   ...
   DoParallel(...);
   ...
 except
 end;

There is only 1 possible location: in a waitloop which should be after the
DoParralel. This loop must check for the exceptions...

Michael.

> 
> 
> > To make it operable, the thread should catch the exception, and then do a
> > synchronize with a procedure that raises the exception, so that when
> > synchronize is called, the exception is raised.
> 
> I don't see how this is possible.

The whole scheme of what you try to achieve is not possible in my opinion, 
because it is ill-defined.

Michael.


More information about the fpc-devel mailing list