<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2100: timed waiting functions cannot timeout if launch::async policy used</title>
<meta property="og:title" content="Issue 2100: timed waiting functions cannot timeout if launch::async policy used">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2100.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="2100"><a href="lwg-defects.html#2100">2100</a>. timed waiting functions cannot timeout if <code>launch::async</code> policy used</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++14">C++14</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2011-11-14 <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++14">C++14</a> status.</p>
<p><b>Discussion:</b></p>

<p>
32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> p5 says
</p>

<blockquote>
<p>
If the implementation chooses the <code>launch::async</code> policy,
</p>
<ul><li>a call to a waiting function on an asynchronous return object that shares the 
shared state created by this <code>async</code> call shall block until the associated thread has
completed, as if joined (32.4.3.6 <a href="https://wg21.link/thread.thread.member">[thread.thread.member]</a>);</li>
</ul>
</blockquote>

<p>
That should say a non-timed waiting function, otherwise, calling a timed waiting function 
can block indefinitely waiting for the associated thread to complete, rather than timing 
out after the specified time.
<p/>
Since <code>std::thread</code> does not provide a <code>timed_join()</code> function (nor does
Pthreads, making it impossible on many platforms) there is no way for a timed waiting 
function to try to join but return early due to timeout, therefore timed waiting 
functions either cannot guarantee to timeout or cannot be used to meet the requirement 
to block until the thread is joined.  In order to allow timed waiting functions to
timeout the requirement should only apply to non-timed waiting functions.
</p>

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

<p>
Detlef: Do we actually need this fix &mdash; is it detectable?
</p>
<p>
Yes &mdash; you will never get a timeout. Should we strike the whole paragraph?
</p>
<p>
Hans: issue with thread local destruction. 
</p>
<p>
Niklas: I have a strong expectation that a timed wait will respect the timeout
</p>
<p>
<em>agreed</em>
</p>
<p>
Detlef: we want a timed wait that does not time out to return like a non-timed wait; but is this implementable?
</p>
<p>
Pablo: Could we simply append ", or else time out"
</p>
<p>
Detlef: the time out on the shared state needs implementing anyway, even if the underlying O/S does not support a timed join.
</p>
<p>
Hans: the net effect is the timeout does not cover the thread local destruction... ah, I see what you're doing
</p>
<p>
Detlef: happy with Pablo's proposal
</p>
<p>
Wording proposed is to append after the word "joined" add ", or else time out"
</p>
<p>
Moved to review with this wording.
</p>

<p><i>[2013, Bristol]</i></p>


<p>
"Non-timed" made the new wording redundant and the result overly weak. Remove it.
<p/>
Attempted to move to add this to the working paper (Concurrency motion 2) without the addition of "non-timed".  
Motion was withdrawn after Jonathan Wakely expressed implementability concerns.
</p>

<p><i>[2013-09, Chicago]</i></p>

<p>
Discussion of interaction with the absence of a Posix timed join.
<p/>
Jonathan Wakely withdrew his objection, so moved to Immediate.
<p/>
Accept for Working Paper
</p>



<p id="res-2100"><b>Proposed resolution:</b></p>
<p><i>[This wording is relative to the FDIS.]</i></p>


<p>Change 32.10.9 <a href="https://wg21.link/futures.async">[futures.async]</a> p5 as indicated:</p>

<blockquote>
<p>
If the implementation chooses the <code>launch::async</code> policy,
</p>
<ul><li>a call to a waiting function on an asynchronous return object 
that shares the shared state created by this <code>async</code> call shall block until the 
associated thread has completed, as if joined<ins>, or else time out</ins>
(32.4.3.6 <a href="https://wg21.link/thread.thread.member">[thread.thread.member]</a>);</li>
</ul>
</blockquote>






</body>
</html>
