Boost logo

Boost :

Subject: Re: [boost] [thread] boost::async and launch::deferred - Runtime Error + PATCH
From: Fernando Pelliccioni (fpelliccioni_at_[hidden])
Date: 2013-03-22 00:42:51


On Thu, Mar 21, 2013 at 9:17 PM, Vicente J. Botet Escriba <
vicente.botet_at_[hidden]> wrote:

> Le 22/03/13 00:17, Fernando Pelliccioni a écrit :
>
> Hi Vicente, hi all,
>
> The following code snippet throws an exception at runtime
>
> boost::future<int> f1 = boost::async( boost::launch::deferred, []() {
> return 123;
> });
>
> int x= f1.get(); //exception thrown
>
> I am using Boost Trunk revision 83512
> I attached a patch, but I'm not sure that's correct, I had no time to see
> the full future.hpp code
>
>
> The current implementation needs some C++11 features (sorry I have not had
> the time to get rid of these features).
> Your patch lets me think that either you are not defining
> BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
> or BOOST_THREAD_PROVIDES_VARIADIC_THREAD is not defined for your compiler.
> Could you confirm?
>
> detail/config.h defines
>
> #if ! defined(BOOST_NO_SFINAE_EXPR) && \
> ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
> ! defined(BOOST_NO_CXX11_DECLTYPE) && \
> ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
> ! defined(BOOST_NO_CXX11_AUTO) && \
> ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
> ! defined(BOOST_NO_CXX11_HDR_TUPLE)
>
> #define BOOST_THREAD_PROVIDES_VARIADIC_THREAD
> #endif
>
>
I am using MSVC10 at the moment, no support for variadic templates.
That is, BOOST_THREAD_PROVIDES_VARIADIC_THREAD is not defined
In this case, is it necessary that I define
BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK?...
...Or support for C++11 (variadics templates) is exclusive?

> Please, let me know if this was not clear in the documentation.
>

I have not seen these requirements in the documentation, but I'm not sure
if the documentation is clear or not. Perhaps I omitted to read it.

>
>
> I noticed that according to N3558, the future::is_ready() function
> should be called "ready".
> http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3558.pdf
>
> What do you think?
>
> I could add it as well as make_ready_future.
>
>
On the other hand, I'm looking to do something like

    boost::future<string> f1 = boost::async( boost::launch::async, []() {
        return someSlowWork(); // (1) executed on other thread
    });

    // int return is a workaround. A compilation error occurs if I use
future<void>
    boost::future<int> f2 = f1.then( boost::launch::deferred [this](
boost::future<string> & f) -> int {
        string result = f.get();
        updateGuiWidget( result );

        return 1;
    });

    I use launch::deferred in the continuation because I need to execute it
on the GUI Thread, but is executed on the same thread as (1)
    I'm not clear if the behavior of boost::future:: then is correct,
according to N3558.
    Using schedullers and executors, I could select the thread of the
continuation, but I don't undestand the purpose of launch polity on "then"
function.

> Best,
> Vicente
>
>
Regards,
Fernando.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk