id,summary,reporter,owner,description,type,status,milestone,component,version,severity,resolution,keywords,cc 12293,boost::future::then lambda called before future is ready.,Jeffrey.Gramowski@…,viboes,"When chaining .then together with anther one and the previous .then returns a boost::future. The lambda will get called before the future is ready. I think what is happening is that the lambda is being called when the outer hidden future is ready. I think that the callback shouldn't be called until the returned future is ready. Here is the sample code which demonstrates the problem. {{{ #!C++ // BoostFutureTest.cpp : Defines the entry point for the console application. // #include ""stdafx.h"" #include // boost version 1.60.0 // has the following set. // #define BOOST_THREAD_VERSION 4 // #define BOOST_THREAD_PROVIDES_EXECUTORS #include int _tmain(int argc, _TCHAR* argv[]) { int value = 0; int tmpValue = 0; boost::promise promise1; boost::promise promise2; auto future1 = promise1.get_future(); auto waitFuture = future1.then([&tmpValue, &promise2](boost::future future){ assert(future.is_ready()); // this works correctly and is ready. std::async(std::launch::async, [&promise2, &tmpValue](){ std::this_thread::sleep_for(std::chrono::seconds(1)); tmpValue = 1; promise2.set_value(); }); return promise2.get_future(); }).then([&value, &tmpValue](boost::future future){ // this lambda is being called before the future is ready. assert(future.is_ready()); // this doesn't work correctly and is not ready. // if we call future.get() this will block until the promise2 has been set be I don't want // the then lambda to block. I want the lambda called when the future is ready. value = tmpValue; }); promise1.set_value(); waitFuture.wait(); std::cout << ""value = "" << value << std::endl; // should print 1 but prints 0 return 0; } }}}",Bugs,closed,Boost 1.62.0,thread,Boost 1.60.0,Problem,fixed,future then,