[cpp-threads] Asynchronous Execution Issues
Lawrence Crowl
Lawrence at Crowl.org
Sat Apr 25 00:05:38 BST 2009
On 4/24/09, Oliver Kowalke <oliver.kowalke at gmx.de> wrote:
> I'm currently implementing a library (boost.task formaly known
> as boost.threadpool) which implements this kind of functionality.
Thanks for the heads up.
> - second item:
> launch_in_thread() (== std::caching_async()) returns a
> handle object which contain a smart pointer of boost::thread
> (==std::thread). If the last instance of this handle gets out of
> scope the custom destructor of smart pointer calls thread::join()
> on the thread object (releasing the thread).
And what happens to objects of thread storage duration?
> BTW handle allows to interrupt the task executed by the thread
> and works as a async completion token (contains a future and
> exposes this interface).
>
> - first:
> launch_in_pool() would be equivalent to std::creating_async()
> passing the task into a threapool and returning a handle object
> too. But destroying a pool-internal-thread is not permitted. In
> this case cleaning up thread-local data (thread_specific_ptr) after
> execution of a task is a problem. Currently it is up to the user.
Hm. Is the mapping reversed? In my proposal, the caching_async
need not join after completion, but may place the thread in a pool
for reuse later.
> Am Friday 24 April 2009 22:39:11 schrieb Lawrence Crowl:
Hm. Your mailer seems incompletely localized. Shouldn't that
be Freitag?
> > At the Summit meeting I took the action item of producing a proposal
> > for a simple asynchronous execution. The idea was to facilities,
> > with an API along the lines of:
> >
> > auto x = std::creating_async( function1 );
> > auto y = std::caching_async( function2 );
> > ....
> > auto a = x.get();
> > auto b = y.get();
> >
> > The difference between the two is that creating_async would always
> > create a new thread, while the caching_async is permitted to reuse
> > threads. The primary operational difference is that thread-local
> > storage is reused in the latter case.
> >
> > There are a couple of issues that make the task more difficult than
> > we thought at the time. As a result, I have a couple of questions.
> >
> > First, consider the case of the caching_async. Because the threads
> > may persist, we need a handle on the list of threads so that we
> > can inform a thread to die so that we destroy any thread-local
> > variables before the global variables that they reference. So, we
> > start needing a manager object, and the whole facility is starting
> > to look too much like a thread pool. I don't feel as though I have
> > a mandate to propose anything that looks like a thread pool. Do
> > you agree?
> >
> > Second, consider the case of the creating_async. The problem here
> > is a touch more subtle. In particular, once the working thread has
> > set its promise, it can start destroying thread-local variables.
> > Unfortunately, we have no idea when that has or might happen.
> > That thread could be stalled immediately after providing the value.
> > The solution is to wait for thread termination before returning the
> > value from the future. This solution implies keeping the thread as
> > part of the future so that we can wait. We have no such mechanism.
> > So, an asynchronous execution function needs another kind of future.
> > Is such a future going beyond my mandate?
--
Lawrence Crowl
More information about the cpp-threads
mailing list