Sorry, but that's not actually true. There are no data races, the atomics prevent that (note that there are only one consumer and one producer)

Regarding the style, it follows the "almost always auto" idea from Herb Sutter

If you enforce that the buffer size is a power of 2 you just use a mask to do the

    if (next_head == buffer.size())
        next_head = 0;
part

If it's a power of two, you don't need the branch at all. Let the unsigned index wrap.

You ultimately need a mask to access the correct slot in the ring. But it's true that you can leave unmasked values in your reader/writer indices.

Interesting, I've never heard about anybody using this. Maybe a bit unreadable? But yeah, should work :)

I believe ConcurrencyKit's impl does this.

https://github.com/concurrencykit/ck/blob/master/include/ck_...

See https://fgiesen.wordpress.com/2012/07/21/the-magic-ring-buff... which takes it even further :)

Nice one!

Indeed that's true. That extra constraint enables further optimization

It's mentioned in the post, but worth reiterating!

This was, in fact, mentioned in the article.