<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2142: packaged_task::operator() synchronization too broad?</title>
<meta property="og:title" content="Issue 2142: packaged_task::operator() synchronization too broad?">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2142.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++14">C++14</a> status.</em></p>
<h3 id="2142"><a href="lwg-defects.html#2142">2142</a>. <code>packaged_task::operator()</code> synchronization too broad?</h3>
<p><b>Section:</b> 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> <b>Status:</b> <a href="lwg-active.html#C++14">C++14</a>
 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2012-03-12 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#futures.task.members">issues</a> in [futures.task.members].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++14">C++14</a> status.</p>
<p><b>Discussion:</b></p>

<p>
According to 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> p.18:
</p>
<blockquote><p>
[A] successful call to [<code>packaged_task::</code>]<code>operator()</code> <em>synchronizes with</em> 
a call to any member function of a <code>future</code> or <code>shared_future</code> object that shares 
the shared state of <code>*this</code>.
</p></blockquote>
<p>
This requires that the call to <code>operator()</code> synchronizes with calls to <code>future::wait_for</code>, 
<code>future::wait_until</code>, <code>shared_future::wait_for</code>, and <code>shared_future::wait_until</code>, 
even when these functions return because of a timeout.
</p>

<p><i>[2012, Portland: move to Open]</i></p>

<p>
If it said "a successful return from" (or "a return from" to cover exceptions) the problem would be more obvious.
</p>
<p>
Detlef: will ask Anthony Williams to draft some wording.
</p>
<p>
Moved to open (Anthony drafted to draft)
</p>

<p><i>[2013-09, Chicago: move to Ready]</i></p>


<p>
Anthony's conclusion is that the offending paragraph is not needed. Already included in the statement 
that the state is made ready.
<p/>
Recommendation: Remove 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> p18 (the synchronization clause). Redundant because of 
32.10.5 <a href="https://wg21.link/futures.state">[futures.state]</a> p9.
</p>
<p>
Moved to Ready
</p>



<p id="res-2142"><b>Proposed resolution:</b></p>
<p>This wording is relative to N3691.</p>

<ol>
<li><p>Remove 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> p18 as indicated:</p>

<blockquote><pre>
void operator()(ArgTypes... args);
</pre><blockquote>
<p>
[&hellip;]
<p/>
<del>-18- <i>Synchronization:</i> a successful call to <code>operator()</code> synchronizes with (1.10) a call to any member function
of a <code>future</code> or <code>shared_future</code> object that shares the shared state of <code>*this</code>. The completion of
the invocation of the stored task and the storage of the result (whether normal or exceptional) into
the shared state synchronizes with (1.10) the successful return from any member function that detects
that the state is set to ready. [<i>Note:</i> <code>operator()</code> synchronizes and serializes with other functions
through the shared state. &mdash; <i>end note</i>]</del>
</p>
</blockquote></blockquote>
</li>
</ol>






</body>
</html>
