This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.
async functionSection: 32.10.9 [futures.async] Status: C++11 Submitter: Alberto Ganesh Barbati Opened: 2011-02-17 Last modified: 2016-01-28
Priority: Not Prioritized
View other active issues in [futures.async].
View all other issues in [futures.async].
View all issues with C++11 status.
Discussion:
Clause 32.10.9 [futures.async] 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.)
[Adopted in Madrid, 2011-03]
Proposed resolution:
Edit 32.10.5 [futures.state], paragraph 3 as follows.
An asynchronous return object is an object that reads results from an associated asynchronous state. A waiting function of an asynchronous return object is one that potentially blocks to wait for the associated asynchronous state to be made ready.
Edit within 32.10.9 [futures.async] paragraph 3 bullet 2 as follows.
Effects: [...]
- if
policy & launch::deferredis non-zero — [...] The associated asynchronous state is not made ready until the function has completed. The first call to a functionrequiring a non-timed waiton an asynchronous return object referring totheassociated asynchronous statecreated by thisshall invoke the deferred function in the thread that called the waiting functionasynccall to become ready;onceevaluation ofINVOKE(g, xyz)begins, the function is no longer considered deferred. [...]
Edit 32.10.9 [futures.async] paragraph 5 as follows.
Synchronization: Regardless of the provided
policyargument,
- the invocation of
asyncsynchronizes with (1.10) the invocation off. [Note: this statement applies even when the corresponding future object is moved to another thread. —end note]; and- the completion of the function
fis sequenced before (1.10) the associated asynchronous state is made ready. [Note:fmight not be called at all, so its completion might never happen. —end note]
Ifpolicy & launch::asyncis non-zero,
- a call to a waiting function on an asynchronous return object that shares the associated asynchronous state created by this
asynccall shall block until the associated thread has completed, as if joined (30.3.1.5);thesynchronizes 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 statejoin()on the created thread objectreturns, whichever happens first.[Editor's note: N3196 changes the following sentence as indicated. N3188 removes the sentence. Please pick one.] 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.