> 
> From: "Peter Dimov" <[EMAIL PROTECTED]>
> Date: 2003/02/10 Mon PM 12:54:28 EST
> To: "Boost mailing list" <[EMAIL PROTECTED]>
> Subject: Re: Re: [boost] Re: A new boost::thread implementation?
> 
> William E. Kempf wrote:
> >> From: "Peter Dimov" <[EMAIL PROTECTED]>
> >>>>     // step 2: execute an async_call
> >>>>     call();
> >>>
> >>> This example, and the implementation above, are just complex
> >>> synchronous calls.  I assume you really meant for either the
> >>> constructor or this call to also take an Executor concept?
> >>
> >> This line could be
> >>
> >> boost::thread exec( ref(call) );
> >>
> >> or
> >>
> >> boost::thread_pool pool;
> >> pool.dispatch( ref(call) );
> >>
> >> I didn't have a prebuilt Boost.Threads library handy when I wrote
> >> the code (rather quickly) so I used a plain call.
> >
> > No, it couldn't be, because async_call isn't copyable ;).  But I get
> > the point.
> 
> Note that I diligently used ref(call) above. ;-)

Yeah, I noticed that when I received my own response.  Sorry about not reading it more 
carefully.

> >> Since operator() is synchronized, i don't see a race... am I missing
> >> something?
> >
> > Sort of... I was thinking about the refactoring where you don't hold
> > the mutex the entire time the function is being called.  But even
> > with out the refactoring, there is some room for error:
> >
> > thread1: call()
> > thread2: call()
> > thread1: result() // which result?
> 
> Unspecified, but I don't think we can avoid that with the low-level
> interface. High level wrappers that package creation and execution would be
> immune to this problem.

Agreed.
 
> >>> Actually, there's another minor issue as well.  The user can call
> >>> operator() and then let the async_call go out of scope with out ever
> >>> calling result().  Mayhem would ensue.  The two options for dealing
> >>> with this are to either block in the destructor until the call has
> >>> completed or to simply document this as undefined behavior.
> >>
> >> Yes, good point, I missed that.
> >
> > I lean towards simple undefined behavior.  How do you feel about it?
> 
> Seems entirely reasonable. I don't think that we can "fix" this. Accessing
> an object after it has been destroyed is simply an error; although this is
> probably a good argument for making async_call copyable/counted so that the
> copy being executed can keep the representation alive.

Yes, agreed.  I'm just not sure which approach is more appropriate... to use dynamic 
allocation and ref-counting in the implementation or to simply require the user to 
strictly manage the lifetime of the async_call so that there's no issues with a truly 
asynchronous Executor accessing the return value after it's gone out of scope.
 


William E. Kempf
[EMAIL PROTECTED]

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to