[C++0x] a better <future>
Jonathan Wakely
jwakely.gcc@gmail.com
Sun Jun 14 12:50:00 GMT 2009
Here's a new <future> patch with the following changes:
The Future_state class has a cleaner interface, not exposing the mutex
or other member variables. All operations that need to be thread-safe
are done by the Future_state, so the rest of the code is cleaner.
A promise<R> and associated futures share ownership of a Future_state
object. A promise allocates a Future_result<R> and transfers
ownership of it to the Future_state when ready.
Any memory required for the result is allocated in the promise
constructor, fixing a weakness in my previous design. This also makes
it easier to add allocator support later.
The result is initialized via placement new so the stored value
doesn't need to be default constructible or assignable, only move
constructible. Initialization isn't inside a critical section,
preventing a deadlock in the 30_threads/promise/members/set_value3.cc
test.
In order to work around core issue 664 and c++/34022,
unique_value<scalar type>::get() returns by value instead of
rvalue-reference. That's incorrect according to the WP, but I believe
it's necessary to avoid returning dangling references. See
Move_future_result for the workaround.
I fixed the packaged_task behaviour that I got wrong, updated
everything w.r.t explicit operators and c++/40007, and adjusted the
tests and commented-out blocks to the correct form.
Extending promise and packaged_task to use allocators will be
relatively simple, it could be done now if the allocator_arg_t tag
type existed. The virtual Future_result_base::_M_destroy() function
exists so that it can be overridden by derived types using alternative
allocators. I hope that will avoid an ABI change when allocator
support is added.
This version started out using a std::atomic_address to hold the
result, avoiding a mutex lock when setting the result or polling the
state, but the performance was much better with mutex locks. The
version of Future_state using atomics has the same interface, so could
be changed later if performance of the atomics improves.
I'm pretty happy with this version, but I'm open to suggestions for
improvements.
Jonathan
-------------- next part --------------
* include/std/future: New.
* include/Makefile.am: Add.
* include/Makefile.in: Regenerate.
* src/future.cc: New.
* src/Makefile.am: Add.
* src/Makefile.in: Regenerate.
* config/abi/pre/gnu.ver: Add export.
* testsuite/30_threads/headers/future/std_c++0x_neg.cc: New.
* testsuite/30_threads/headers/future/types_std_c++0x.cc: New.
* testsuite/30_threads/packaged_task/cons/1.cc: New.
* testsuite/30_threads/packaged_task/cons/2.cc: New.
* testsuite/30_threads/packaged_task/cons/assign_neg.cc: New.
* testsuite/30_threads/packaged_task/cons/copy_neg.cc: New.
* testsuite/30_threads/packaged_task/cons/move_assign.cc: New.
* testsuite/30_threads/packaged_task/cons/move.cc: New.
* testsuite/30_threads/packaged_task/members/boolconv.cc: New.
* testsuite/30_threads/packaged_task/members/get_future2.cc: New.
* testsuite/30_threads/packaged_task/members/get_future.cc: New.
* testsuite/30_threads/packaged_task/members/invoke2.cc: New.
* testsuite/30_threads/packaged_task/members/invoke3.cc: New.
* testsuite/30_threads/packaged_task/members/invoke4.cc: New.
* testsuite/30_threads/packaged_task/members/invoke5.cc: New.
* testsuite/30_threads/packaged_task/members/invoke.cc: New.
* testsuite/30_threads/packaged_task/members/reset2.cc: New.
* testsuite/30_threads/packaged_task/members/reset.cc: New.
* testsuite/30_threads/packaged_task/members/swap.cc: New.
* testsuite/30_threads/packaged_task/requirements/
explicit_instantiation.cc: New.
* testsuite/30_threads/promise/cons/1.cc: New.
* testsuite/30_threads/promise/cons/assign_neg.cc: New.
* testsuite/30_threads/promise/cons/copy_neg.cc: New.
* testsuite/30_threads/promise/cons/move_assign.cc: New.
* testsuite/30_threads/promise/cons/move.cc: New.
* testsuite/30_threads/promise/members/get_future2.cc: New.
* testsuite/30_threads/promise/members/get_future.cc: New.
* testsuite/30_threads/promise/members/set_exception2.cc: New.
* testsuite/30_threads/promise/members/set_exception.cc: New.
* testsuite/30_threads/promise/members/set_value2.cc: New.
* testsuite/30_threads/promise/members/set_value3.cc: New.
* testsuite/30_threads/promise/members/set_value.cc: New.
* testsuite/30_threads/promise/members/swap.cc: New.
* testsuite/30_threads/promise/requirements/
explicit_instantiation.cc: New.
* testsuite/30_threads/shared_future/cons/assign_neg.cc: New.
* testsuite/30_threads/shared_future/cons/copy.cc: New.
* testsuite/30_threads/shared_future/cons/default_neg.cc: New.
* testsuite/30_threads/shared_future/cons/move.cc: New.
* testsuite/30_threads/shared_future/members/get2.cc: New.
* testsuite/30_threads/shared_future/members/get.cc: New.
* testsuite/30_threads/shared_future/members/has_exception.cc: New.
* testsuite/30_threads/shared_future/members/has_value.cc: New.
* testsuite/30_threads/shared_future/members/is_ready.cc: New.
* testsuite/30_threads/shared_future/members/wait.cc: New.
* testsuite/30_threads/shared_future/members/wait_for.cc: New.
* testsuite/30_threads/shared_future/members/wait_until.cc: New.
* testsuite/30_threads/shared_future/requirements/
explicit_instantiation.cc: New.
* testsuite/30_threads/unique_future/cons/assign_neg.cc: New.
* testsuite/30_threads/unique_future/cons/copy_neg.cc: New.
* testsuite/30_threads/unique_future/cons/default_neg.cc: New.
* testsuite/30_threads/unique_future/cons/move.cc: New.
* testsuite/30_threads/unique_future/members/get2.cc: New.
* testsuite/30_threads/unique_future/members/get.cc: New.
* testsuite/30_threads/unique_future/members/has_exception.cc: New.
* testsuite/30_threads/unique_future/members/has_value.cc: New.
* testsuite/30_threads/unique_future/members/is_ready.cc: New.
* testsuite/30_threads/unique_future/members/wait.cc: New.
* testsuite/30_threads/unique_future/members/wait_for.cc: New.
* testsuite/30_threads/unique_future/members/wait_until.cc: New.
* testsuite/30_threads/unique_future/requirements/
explicit_instantiation.cc: New.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: future4.patch
Type: text/x-patch
Size: 149011 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20090614/2eb5e520/attachment.bin>
More information about the Libstdc++
mailing list