I have to program a multiple producer-consumer system in C++, but I'm lost trying to put together each part of the model (threads with its correct buffer). The basic functioning of the model is: I have an initial thread that executes a function. This returned results need to be put in an undetermined number of buffers, because each elements that the function proccess is different and it needs to be treated in a single thread. Then, with the data stored in the buffers, another n threads need to get the data of this buffers to do another function, and the return of this need to be put in some buffers again.
At the moment I have got this buffer structure created:
template <typename T> class buffer { public: atomic_buffer(int n); int bufSize() const noexcept; bool bufEmpty() const noexcept; bool full() const noexcept; ~atomic_buffer() = default; void put(const T & x, bool last) noexcept; std::pair<bool,T> get() noexcept; private: int next_pos(int p) const noexcept; private: struct item { bool last; T value; }; const int size_; std::unique_ptr<item[]> buf_; alignas(64) std::atomic<int> nextRd_ {0}; alignas(64) std::atomic<int> nextWrt_ {0}; }; I've also created a vectorstructure which stores a collection un buffers, in order to satisfy the undetermined number of threads necessity.
std::vector<std::unique_ptr<locked_buffer<std::pair<int, std::vector<std::vector<unsigned char>>>>>> v1; for(int i=0; i<n; i++){ v1.push_back(std::unique_ptr<locked_buffer<std::pair<int,std::vector<std::vector<unsigned char>>>>> (new locked_buffer<std::pair<int, std::vector<std::vector<unsigned char>>>>(aux))); } Edit:



