lockless Ring buffer in C

Hi guys,

Another follow up from this post:

http://www.experts-exchange.com/Programming/Languages/C/Q_26488392.html

Basically, keeping the interface the same, can anyone provide a lockless implementation? i.e. one that does not need mutex or atomic counter updates.

I'm looking for a drop in replacement for the points :-)
PMembreyAsked:
Who is Participating?
 
phoffricConnect With a Mentor Commented:
Polling with ms sleeps along with previous post in your question:

http:#33725666 indicates that atomicity is not required for ring/circular buffers.
You can get by with head/tail pointers.
   http://en.wikipedia.org/wiki/Circular_buffer#Circular_buffer_mechanics
   http://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction
The "Always Keep One Slot Open" is a simple solution that always keeps one slot unallocated. This includes an example implementation in C. (No thread issues here.)

Reading on, if you use an additional fill count (as your link suggests), then "This can require complex logic, especially if you are working with different threads."

But reading on, there are other solutions that do not have the thread issues.

There are other code solutions further down.
0
 
PMembreyAuthor Commented:
Yes, but I'm looking for a solution that I can drop-in in place of the current one - one that does not need a counter.
0
 
phoffricConnect With a Mentor Commented:
Ok. Note that the "Always Keep One Slot Open" solution does not use a counter. But, I'll see what others suggest. Always nice to see other solutions. If you remove the counter from your original link, then you have to make changes. In the end, you may end up with a solution similar to one of the ones suggested in the wiki link.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
Infinity08Commented:
A completely lock-free circular buffer could be done if there is only one reader and one writer. If you have more than one reader and/or more than one writer, this becomes extremely hard, if not impossible.

I'm not sure what other mechanisms can be added than the ones that phoffric already pointed out. I personally like the solution that keeps one slot free, because it's simple and straightforward to implement.

Please don't award any points to this post, because I'm merely confirming what phoffric already said. I just posted, because you seemed to be waiting for further input before closing the question.
0
 
PMembreyAuthor Commented:
Pity it can't be done but I couldn't see how it would work either. Thanks for confirmation.
0
 
Infinity08Commented:
That's not what we said : it can be done in several ways. Refer to all the options presented by phoffric :)
0
 
PMembreyAuthor Commented:
A lockless ring buffer that is accessed by multiple reader and writer threads? :)
0
 
Infinity08Commented:
Ah, ok :)

I was basing my statement on what you said in the related question : "I have written a ring buffer and have one thread reading and one writing."
0
All Courses

From novice to tech pro — start learning today.