Буфер пакетной обработки без блокировки с несколькими производителями и одним потребителем с c 11

#c #c 11 #lock-free #stdatomic

Вопрос:

Мне нужен безблокировочный пакетный буфер с несколькими производителями и одним потребителем, но я не могу этого сделать. Скелет кода выглядит следующим образом. НУЖНА ПОМОЩЬ!!

 class MyBatch{
    public:
        atomic<bool> consumer_flag{flase};
    public:
        void push(char* data, uint32 data_len){
            while(cur_pos.load()   data_len >= max_buffer_size){
                consumer_flag.store(true);
                //and othres can use consumeAllBatch() to consume the whole batch data
            }
            memcpy(buffer   cur_pos.load(), data, data_len);
            cur_pos  = data_len;
        };
        char* consumeAllBatch(){
            cur_pos.store(0);
        };
    private:
        char* buffer;
        atomic<uint32> cur_pos{0};
        uint32 max_buffer_size{1<<16};
}
 

Комментарии:

1. Вы пробовали просматривать существующие очереди MPMC и оптимизировать их на основе наличия только одного потребителя? например, счетчики, которые обновляются только потребителем, могут использоваться отдельно-атомарные нагрузки и хранилища вместо атомарного RMW.