#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.