On Sat, Jan 17, 2015 at 8:48 AM, TONGARI J <tongari95@gmail.com> wrote:
2015-01-17 21:45 GMT+08:00 TONGARI J <tongari95@gmail.com>:
Hi,

The sample code is here:

The boost::future adaption code is adapted from N4286.

Tested with VS2015 preview.
If std::promise is passed, the code works fine.
Any clue why it hangs if boost::promise is passed?

Forgot to mention that it's compiled with Boost 1.57, BOOST_THREAD_VERSION=4, x64
 
Thanks.


I found two bugs in this portion of boost::future last week, and I have been meaning to post to trac and offer assistance in fixing. The first bug is in the .then() continuation - it is supposed to block in this situation (according to the docs), just like boost/std::async does if the future object is ignored. Instead, it continues unblocked. The second bug is a consequence of ignoring the returned future. The call to .set_value() acquires the mutex, and invokes the continuation on a separate thread. The continuation then tries to acquire the mutex (has_exception), and blocks waiting for the set_value() to clear. set_value() is in turn waiting for the continuation thread to join because nothing else has a handle to the thread.

The best way to get around this is to _not_ ignore the returned future from the .then call. I also have patch that fixes the second bug, but fixing the first bug will require enough changes that will likely result in an obsolete patch.

Lee