Boost logo

Boost Users :

Subject: Re: [Boost-users] [LockFree] a queue of std::shared_ptr?
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2013-02-22 12:01:57


On Fri, Feb 22, 2013 at 8:14 AM, Krzysztof Czainski <1czajnik_at_[hidden]>wrote:

> 2013/2/12 Michael Caisse <mcaisse-lists_at_[hidden]>
>
>> On 02/11/2013 04:04 PM, Scott Smedley wrote:
>>
>>> Hi all,
>>>
>>> Is it possible to store std::shared_ptr objects in a
>>> boost::lockfree::queue?
>>>
>>> eg. boost::lockfree::queue<std::**shared_ptr<Message>> q;
>>>
>>> Hi Scott -
>>
>> Lockfree queues require that the queued type (T) meets the following
>> requirements:
>>
>> o T must have a copy constructor
>> o T must have a trivial assignment operator
>> o T must have a trivial destructor
>>
>>
>> shared_ptr has neither a trivial assignment operator or destructor and
>> cannot be used in the lockfree containers.
>>
>> michael
>>
>
> Hello,
>
> I'm curious: suppose T is a type, that meets requirements for lockfree
> queues. Does optional<T> meet those requirements?
>
> a) Does optional<T> have a copy constructor? Yes.
> b) Does optional<T> have a trivial assignment operator? Well, the
> assignment is user-written in optional, but it's observable effect is
> equivalent to memcpy, isn't it?
> c) Does optional<T> have a trivial destructor? Well, optional's destructor
> conditionally calls T's destructor, which is trivial. So is a destructor
> trivial, if all it does is conditionally call a trivial destructor?
>

This is true in theory for an optional implementation like boost::optional,
which uses a boolean flag to indicate initialization state, though I'd
doubt all the necessary type traits are specialized for boost::optional.
However, an optional implementation that uses a pointer to indicate
initialization state (null pointer indicates uninitialized, otherwise
pointer points to internal buffer; thus, get_ptr() just returns the
pointer) would not have a trivial copy constructor and assignment operator,
and I think technically, whether boost::optional uses a boolean flag or a
pointer is an implementation detail.

- Jeff



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net