On Wednesday, 9 May 2018 at 04:17:17 UTC, Shachar Shemesh wrote:
On 09/05/18 01:09, David Nadlinger wrote:
The algorithm isn't wait-free (haven't thought too carefully about this, though)

This mirrors a discussion I had with Maor (who originally wrote it). Let's see if I bring you around the way I was brought around.

Ah, and I've been taking Liran to be the originator of this fine piece of work up to now… ;)

At the API level, there are two areas where the algorithm *cannot* be wait free. If a consumer tries to consume from an empty queue, or a producer tries to produce to a full one.

True, but some applications might favour APIs which can provide these guarantees by blocking instead of aggressively early-returning. For example, one could use a helping scheme to implement a MPSC queue that doesn't starve any producers even if the queue is close to full, or a SPMC queue that doesn't starve any consumers even if the queue is close to empty.

Those two aside […] the algorithm actually is wait free.

Is it, though?

If we assume the usual definition of wait-freedom (bounded number of steps for each thread to make progress), then MCSPQueue.pop() is problematic, as any one thread could get persistently unlucky with the cas(). This could also be the case in the steady state with a non-empty queue; for example, if the producer pushes elements at a rate matching that at which (n - 1) of n consumer threads pop them.

I'd need to think more carefully about the non-sequentially-consistent isFull() before making any statements about SCMPQueue.

 — David


Reply via email to