c++ - Why does boost::when_all spawn a new thread -


i have following code, compiled boost 1.62.

#define boost_thread_version 4 #define boost_thread_provides_executors  #include <chrono> #include <thread> #include <boost/thread/future.hpp> #include <boost/thread/executors/loop_executor.hpp>  using namespace std::literals::chrono_literals; int main() {      auto start = boost::make_ready_future<int>();      boost::loop_executor ex;      auto = start.then(ex, [](auto &&) { std::cout << "a"; }).share();      auto b = boost::when_all(a).then(ex, [](auto &&) { std::cout << "b";} );     auto c = boost::when_all(a).then(ex, [](auto &&) { std::cout << "c";} );      auto d = boost::when_all(std::move(b),std::move(c)).then(ex, [](auto &&) { std::cout << "d";} );      while ( ex.try_executing_one() )          std::this_thread::sleep_for(100ms);      d.get();      return 0; } 

this spawns 4 tasks (a,b,c,d) diamond dependency on them ( b , c depend on a, d depends on b , c ).

given fact using loop_executor, expected code not spawn thread , output either "abcd" or "acbd".

instead code might or might not deadlock @ d.get() (just reduce sleep time 0 see deadlocking), because every call when_all spawns new thread used wait on futures.

i under impression when_all implemented in terms of .then, buffer store task result , atomic counter.

question:

is there fundamental design reason requires when_all spawn new thread?

in particular wondering if behavior expected hypothetical implementation of concurrency ts.

in opinion, boost::when_all not spawn new thread, think logic simple follow semantic can understand. boost::loop_executor spawns threads, , boost::when_all give threads order. loop_executor mean execute in loop, if d.get() happened, deadlock.


Comments

Popular posts from this blog

aws api gateway - SerializationException in posting new Records via Dynamodb Proxy Service in API -

asp.net - Problems sending emails from forum -