...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Fiber local storage allows a separate instance of a given data item for each fiber.
When a fiber exits, the objects associated with each fiber_specific_ptr
instance
are destroyed. By default, the object pointed to by a pointer p
is destroyed by invoking delete p
,
but this can be overridden for a specific instance of fiber_specific_ptr
by
providing a cleanup routine func
to the constructor. In this case, the object is destroyed by invoking func(p)
. The cleanup functions are called in an unspecified
order.
fiber_specific_ptr
#include <boost/fiber/fss.hpp> namespace boost { namespace fibers { template< typename T > class fiber_specific_ptr { public: typedef T element_type; fiber_specific_ptr(); explicit fiber_specific_ptr( void(*fn)(T*) ); ~fiber_specific_ptr(); fiber_specific_ptr( fiber_specific_ptr const&) = delete; fiber_specific_ptr & operator=( fiber_specific_ptr const&) = delete; T * get() const noexcept; T * operator->() const noexcept; T & operator*() const noexcept; T * release(); void reset( T *); }; }}
fiber_specific_ptr(); explicit fiber_specific_ptr( void(*fn)(T*) );
delete this->get()
is well-formed; fn(this->get())
does not throw
Construct a fiber_specific_ptr
object for storing
a pointer to an object of type T
specific to each fiber. When reset()
is called, or the fiber exits, fiber_specific_ptr
calls
fn(this->get())
.
If the no-arguments constructor is used, the default delete
-based
cleanup function will be used to destroy the fiber-local objects.
fiber_error
if an error
occurs.
~fiber_specific_ptr();
All the fiber specific instances associated to this fiber_specific_ptr
(except
maybe the one associated to this fiber) must be nullptr.
Calls this->reset()
to clean up the associated value for the current fiber, and destroys
*this
.
The requirement is an implementation restriction. If the destructor promised
to delete instances for all fibers, the implementation would be forced
to maintain a list of all the fibers having an associated specific ptr,
which is against the goal of fiber specific data. In general, a fiber_specific_ptr
should
outlive the fibers that use it.
Note | |
---|---|
Care needs to be taken to ensure that any fibers still running after an instance
of |
get
()
T * get() const noexcept;
The pointer associated with the current fiber.
Nothing.
Note | |
---|---|
The initial value associated with an instance of |
operator->
()
T * operator->() const noexcept;
this->get()
is not nullptr
.
this->get()
Nothing.
operator*
()
T & operator*() const noexcept;
this->get()
is not nullptr
.
*(this->get())
Nothing.
release
()
T * release();
Return this->get()
and store nullptr
as the
pointer associated with the current fiber without invoking the cleanup
function.
this->get()==nullptr
Nothing.
reset
()
void reset( T * new_value);
If this->get()!=new_value
and this->get()
is not nullptr
,
invoke delete this->get()
or fn(this->get())
as appropriate. Store new_value
as the pointer associated
with the current fiber.
this->get()==new_value
Exception raised during cleanup of previous value.