Giter Site home page Giter Site logo

Comments (5)

cameron314 avatar cameron314 commented on June 2, 2024

A few notes:

  • There's a race between no slots being available and overwriting the oldest element
  • More generally, there's a race between the producer overwriting the oldest element and the consumer also trying to dequeue it
  • This code is not exception safe (I believe neither is mine, to be fair)
  • I don't quite understand how this would fit into the existing code (given there's no block manipulation)

from readerwriterqueue.

Tetragramm avatar Tetragramm commented on June 2, 2024

Hmm. I get the second race, (IE: the producer pauses, the consumer reads the entire queue including a possibly in mid modification oldest element).

I'm not sure what you mean by the first one though. Do you mean that an element might be overwritten even though a free slot has opened up since the semaphore was checked? Or is there a way for the consumer to be reading the element as it's being overwritten?

from readerwriterqueue.

cameron314 avatar cameron314 commented on June 2, 2024

The first race is a subset of the second, so it's not really important, but what I was referring to was:

  1. slots_->tryWait() fails, so the producer enters the if
  2. Meanwhile, the consumer consumes a single element (the oldest one, since this is a FIFO queue)
  3. The producer now either destructs the next element (despite a slot being available) or double-destructs the same element that was just consumed

from readerwriterqueue.

Tetragramm avatar Tetragramm commented on June 2, 2024

I see where my mistake is now. I knew destructing two elements at once is possible, and just the cost of multi-threaded programming, but I thought double-destructing was impossible because size_t increment is atomic.
Unfortunately, that is true only for specific architectures, so it's not safe to rely on.

Thank you for your help and advice.

from readerwriterqueue.

cameron314 avatar cameron314 commented on June 2, 2024

size_t increment is not atomic but std::atomic<size_t> increment is. Not sure how this would help here though.

from readerwriterqueue.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.