<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2032: Incorrect synchronization clause of async function</title>
<meta property="og:title" content="Issue 2032: Incorrect synchronization clause of async function">
<meta property="og:description" content="C++ library issue. Status: C++11">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2032.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++11">C++11</a> status.</em></p>
<h3 id="2032"><a href="lwg-defects.html#2032">2032</a>. Incorrect synchronization clause of <code>async</code> function</h3>
<p><b>Section:</b> 32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> <b>Status:</b> <a href="lwg-active.html#C++11">C++11</a>
 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2011-02-17 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View other</b> <a href="lwg-index-open.html#futures.async">active issues</a> in [futures.async].</p>
<p><b>View all other</b> <a href="lwg-index.html#futures.async">issues</a> in [futures.async].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++11">C++11</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Clause 32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> has undergone significant rewording
in Batavia. Due to co-presence of at least three different sources
of modification there is a part where changes have overlapped
(marked by an Editor's note), which should be reconciled. Moreover,
I believe that a few non-overlapping sentences are now incorrect
and should be fixed, so the problem cannot be handled editorially.
(See c++std-lib-29667.)
</p>

<p><i>[Adopted in Madrid, 2011-03]</i></p>




<p id="res-2032"><b>Proposed resolution:</b></p>
<ol>
<li>
<p> 
Edit 32.10.5 <a href="https://wg21.link/futures.state">[futures.state]</a>, paragraph 3 as follows.
</p>

<blockquote>
<p>
An <dfn>asynchronous return object</dfn>
is an object that reads results from an associated asynchronous state.
A <dfn>waiting function</dfn> of an asynchronous return object
is one that potentially blocks
to wait for the associated asynchronous state to be made ready.
<ins>If a waiting function can return
before the state is made ready because of a timeout (30.2.5),
then it is a <dfn>timed waiting function</dfn>,
otherwise it is a <dfn>non-timed waiting function</dfn>.</ins>
</p>
</blockquote>
</li>

<li>
<p>
Edit within 32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> paragraph 3 bullet 2 as follows.
</p>

<blockquote>
<p>
<i>Effects:</i>
[...]
</p>
<ul><li>if <code>policy &amp; launch::deferred</code> is non-zero &mdash; [...]
The associated asynchronous state is not made ready
until the function has completed.
The first call to a <ins>non-timed waiting</ins> function
<ins>(30.6.4 [futures.state])</ins>
<del>requiring a non-timed wait</del>
on an asynchronous return object
referring to <del>the</del> <ins>this</ins>
associated asynchronous state
<del>created by this <code>async</code> call to become ready</del>
shall invoke the deferred function
in the thread that called the waiting function<del>;</del><ins>.</ins>
<del>once</del> <ins>Once</ins> evaluation of
<code><var>INVOKE</var>(g, xyz)</code> begins,
the function is no longer considered deferred.
[...]
</li></ul>
</blockquote>
</li>

<li>
<p>
Edit 32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> paragraph 5 as follows.
</p>

<blockquote>
<p>
<i>Synchronization:</i>
Regardless of the provided <code>policy</code> argument,
</p>
<ul>
<li>
the invocation of <code>async</code> synchronizes with (1.10)
the invocation of <code>f</code>.
[<i>Note:</i>
this statement applies even when the corresponding future object
is moved to another thread.
&mdash;<i>end note</i>];
and
</li>
<li>
the completion of the function <code>f</code>
is sequenced before (1.10) the associated asynchronous state is made ready.
[<i>Note:</i>
<code>f</code> might not be called at all,
so its completion might never happen.
&mdash;<i>end note</i>]
</li>
</ul>

<p>
<del>If <code>policy &amp; launch::async</code> is non-zero,</del>
<ins>If the implementation chooses the <code>launch::async</code> policy,</ins>
</p>
<ul>
<li>
a call to a waiting function on an asynchronous return object
that shares the associated asynchronous state
created by this <code>async</code> call
shall block until the associated thread has completed,
as if joined (30.3.1.5);
</li>
<li>
<del>the <code>join()</code> on the created thread object</del>
<ins>the associated thread completion</ins>
synchronizes with (1.10)
the return from the first function
that successfully detects the ready status of the associated asynchronous state
or with the return from the last function that 
releases the associated asynchronous state <del>returns</del>,
whichever happens first.
<del><b>[Editor's note:
N3196 changes the following sentence as indicated.
N3188 removes the sentence.
Please pick one.]</b>
If the invocation is deferred,
the completion of the invocation of the deferred function
synchronizes with the successful return
from a call to a waiting function on the associated asynchronous state.</del>
</li>
</ul>
</blockquote>

</li>
</ol>






</body>
</html>
