Boost logo

Boost Users :

Subject: Re: [Boost-users] [Review] Lockfree review starts today, July 18th
From: Tim Blechmann (tim_at_[hidden])
Date: 2011-07-18 19:08:42


hi john,

> - You provide a mp-mc queue, a sp-sc queue, and a mp-mc stack. Are
> there any other combinations you know of for which an implementation
> could usefully be provided; e.g. could a sp-mc stack be made faster than
> the one you've provided?

good questions ... possibly, but i am not aware of such an algorithm ...

> - Some of your function declarations have explicitly-void argument lists
> (e.g. fifo's default constructor). This is correct, but unconventional.
> An empty argument list would be less confusing, IMO.

this is my personal coding style, if people suggest to remove it, i can do that.

> - You describe it as a 'limitation' that "The class T is required to
> have a trivial assignment operator.". I think this is better described
> as a 'requirement'. Are there any other requirements? I'm guessing it
> must be CopyConstructible, or at least MoveConstructible? Are you sure
> you don't need a trivial destructor and/or copy constructor in addition
> to the trivial assignment?

hm, you are right. it both needs to have a trivial destructor and a copy
constructor. i don't want to provide any move semantic, enqueue/push may fail if
no nodes can be allocated.

> - fifo::empty is described as non-thread-safe. To what extent? Might
> it crash the program or corrupt the container, or is it simply that
> other threads can change the content of the container at a whim, and so
> the result of calling empty might not persist until the next operation?

it won't crash, but the answer will may be incorrect.

> - Does the specialization fifo<T *, freelist_t, Alloc> also require that
> T is trivially assignable, or even that it is assignable at all? It's
> not clear. If it is actually storing pointers is there a risk of memory
> leaks if the container is destroyed while non-empty? If it's not
> actually storing pointers, then what am I to do if I genuinely want a
> fifo of pointers? Generally I find this specialization a bit worrying
> since its semantics differ so markedly from the unspecialized equivalent.

i actually like matthew's proposal of templating the dequeue/pop argument. that
would make the specialization obsolete.
currently, destroying a non-empty fifo<T*> would leak memory.

> - You have documented no requirements on ringbuffer's T type. So I
> guess it needn't be trivially assignable; but again I guess it must be
> CopyConstructible?

correct, i should document this

> - The ringbuffer docs mention several times the type 'T const (&)',
> which doesn't make sense; I'm guessing a '[size]' has been cut out at
> some point in the documentation generation process.

hrrr ... you are right ... will need to add this to my list of questions for the
quickbook/doxygen masters ...

> - stack's empty is documented differently from the others; is it
> different somehow; more safe? more suitable for non-debugging purposes?

yes it is: stack::empty() does just need to check if there is a top node
available().

> - The fifo and stack insertion functions both return false if "if the
> freelist is not able to allocate a new fifo node.". Is this only when
> using a fixed-sized freelist which has used all it's size, or might this
> also happen with a caching freelist when allocation fails (e.g. due to
> running out of memory). To put it another way: how are you handling
> exceptions thrown by the allocator?

no, but i guess for consistency reasons i should do that!

> - BOOST_STATIC_ASSERT is classed as a "private member function"; I guess
> this is a side-effect of auto-generated docs or something, but it's
> rather odd.

thanks, will hide it for the doxygen pass.

> - Why does ringbuffer have range enqueue functionality, but not the
> other two classes?

the ringbuffer will be able to enqueue the range in one step, stack and fifo
cannot do this. but maybe it would make sense to add a range interface, but
document the behavior.

> - Why have you provided a pointer specialization for fifo but not stack?

:) historical reasons ... i should either provide a specializaton for both or
for none ...

> - Since these classes have various methods in common, would it be worth
> pulling those out and documenting them once centrally (in the way the
> standard does).

well, there may be subtle differences because of the implementation. e.g.
fifo::empty() vs stack::empty() ...

thanks for your comments, i will address the issues in the next days ...

cheers, tim


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