$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2008-06-02 13:02:32
Frank Mori Hess:
> Oh, my use case is the "lifting of an ordinary function to an asynchronous
> one
> that takes/returns future_value objects" I mentioned earlier in the post.
> To
> be more specific:
>
> http://www.comedi.org/projects/libpoet/boostbook/doc/boostbook/html/poet/active_function.html
Hm.
It would be nice if you could provide a better motivating example. :-)
That aside, I'm not sure why you need future_value semantics. Let's assume
that one has a primitive
future<R> async( F f, A1 a1, ..., An an );
that schedules bind(f,a1,a2,...,an) for execution. It wouldn't be hard to
make it recognize when Ai is future<Bi> and do the following instead:
async_with_guard(
bind( A1::ready, a1 ) && ...,
f,
bind( A1::get, a1 ), ... );
The 'guard' predicate is just symbolic since the scheduler would in reality
store the futures as dependencies and use the appropriate "multi-multiwait".
But the point is that I don't see the above requiring any
future_value-specific operations.
Or stated differently:
future<double> fd1 = async( f1, 0 );
future<double> fd2 = async( f1, 1 );
future<double> fd = async( f2, fd1, 0.3, fd2, 0.7 );
// actually does:
future<double> fd = async_with_dependencies(
bind( f2,
bind( future<double>::get, fd1 ), 0.3,
bind( future<double>::get, fd2 ), 0.7 ), // function object
fd1, fd2 ); // dependency list
In this case one would need to use something like protect(fd1) if the
function really takes a future.
It's not clear whether the goal of libpoet is to provide fine-grained
parallelism or lazy evaluation; if the latter, one could expect all
functions to take futures, since an active_function provides no fine-grained
laziness. In this case the above "activize by default" approach won't be
very convenient.