title: std::async() does not seem to really implement single-threaded asynchronous behaviour?
body: <p><strong>Context:</strong> I was looking at how asynchronous programming really works. After some investigation on the topic, the resulting idea was that there are two things to differentiate:</p>
  
  <ul>
  <li>Concurrency (synchronous/asynchronous): About tasks</li>
  <li>Multi-threading: About workers</li>
  </ul>
  
  <p>Based on these concepts, we can identify 4 main ways to parallelize tasks. Better than 100 words, I have made a drawing to illustrate this:</p>
  
  <p><a href="https://i.stack.imgur.com/lD550.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/lD550.png" alt="enter image description here"></a></p>
  
  <p><strong>Note:</strong> The 4<sup>th</sup> column (<em>Multi-threaded asynchronous</em>) will not be considered here since it mixes multi-threading and asynchronous programming.</p>
  
  <p>In <a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged &#39;c++&#39;" rel="tag">c++</a>, we have the template function <a href="https://en.cppreference.com/w/cpp/thread/async" rel="nofollow noreferrer">std::async()</a> to allow us to run a function asynchronously.</p>
  
  <p>We can set the <a href="https://en.cppreference.com/w/cpp/thread/launch" rel="nofollow noreferrer">launch policy</a> at:</p>
  
  <ul>
  <li><code>std::launch::async</code>: Run "asynchronously" in a separate thread.</li>
  <li><code>std::launch::deferred</code>: Run when the result is requested.</li>
  </ul>
  
  <p><strong>Question:</strong> If we take a look at my drawing, the <code>std::launch::async</code> policy seems to behave as <em>Multi-threaded synchronous</em> and the <code>std::launch::deferred</code> policy seems to behave as an isolated case of <em>Single-threaded asynchronous</em> (the function is oneshot executed when the result is requested).</p>
  
  <p>But if I'm not mistaken, the idea behind <em>Single-threaded asynchronous</em> is that in case of waiting for a resource to be available or when struggling with some latency (disk access time, ...), the program should not keep blocking the main thread (and so wasting time) and go on to do the next task instead (and come back later to the previous one).</p>
  
  <p>What I don't understand is that <code>std::async()</code> does not seem to allow this kind of behaviour. We can only either run the task synchronously in another thread or running it once and for all when the result is requested (as late as possible).</p>
  
  <p>If we take a look at my drawing, the <em>Single-threaded asynchronous</em> method is not really implemented <strong><em>since the function runs in "oneshot" no matter if it will have to wait for a resource or not</em></strong>. So we will still waste time in this case.</p>
  
  <p>I'm wondering why ? Is my understanding wrong ? Is it an oversight in the <code>std::async()</code> implementation or is it intentional (by the standard) ?</p>
  
  <hr>
  
  <p><em><sub> <strong>Edit:</strong> I'm not sure if it is the right place to ask this question since it is not really a "coding" issue/question.</sub></em></p>