lock free - LockFree MultiConsumer/MultiProducer Queue -


i've written simple lock-free single-consumer/-producer queue. it's supposed work this:

  • at time many consumers may read it
  • at time multiple producers can write it, added elements made available later
  • after write modification finished, call "makepushedelementsavailable()", consumers can read newly added elements

.

template<typename t, int size> class mcmpqueue { public:     mcmpqueue();     bool trypushlater(const t &element);     bool trypop(t &element);     void makepushedelementsavailable(); protected: private:     t elements[size];     std::atomic<int> ihead, itail, iwrite; };  template<typename t, int size> mcmpqueue<t, size>::scmpqueue() : ihead(0), itail(0), iwrite(0) { }  template<typename t, int size> void mcmpqueue<t, size>::makepushedelementsavailable() {     itail.store(iwrite.load()); }  template<typename t, int size> bool mcmpqueue<t, size>::trypop(t &element) {     int newindex;     int index;     {         index = ihead.load();         if (index == itail.load())             return false;         newindex = index + 1;     } while (!ihead.compare_exchange_weak(index, newindex));      index = index % size;     element = elements[index];     return true; }  template<typename t, int size> bool mcmpqueue<t, size>::trypushlater(const t &element) {     int newindex;     int index;     {         index = iwrite.load();         if (index - ihead.load() >= size)             return false;         newindex = index + 1;     } while (!iwrite.compare_exchange_weak(index, newindex));      index = index % size;     elements[index] = element;     return true; } 

so far seems work fine, i'd have checked others though please. there simpler way making elements available after updating has finished?

thanks.


Comments

Popular posts from this blog

1111. appearing after print sequence - php -

java - WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/board/] in DispatcherServlet with name 'appServlet' -

node.js - Express and Redis - If session exists for this user, don't allow access -