Я новичок в boost::asio.
Мне нужно закодировать модуль, который читает из канала и помещает данные в кольцевой буфер (у меня нет проблем с реализацией этой части).
Другая часть модуля ожидает, пока потребитель откроет новое TCP-соединение или сокет домена unix, и когда соединение установлено, он отправляет полное содержимое кольцевого буфера, а затем отправляет любые новые данные, как только они помещаются в кольцевой буфер. . Разрешено несколько потребителей, и один потребитель может открыть новое соединение в любое время.
Первая наивная реализация, о которой я подумал, состоит в том, чтобы хранить отдельный asio::streambuf для каждого соединения и помещать в него весь кольцевой буфер при соединении, а затем каждые новые данные, но это кажется очень неоптимальным методом делать это как в памяти и циклы процессора, поскольку данные должны быть скопированы для каждого соединения, возможно, несколько раз, поскольку я не знаю, делает ли boost::asio::send (или стек linux tcp/ip) копию данных.
Поскольку моя идея состоит в том, чтобы вообще не использовать многопоточность, я думаю об использовании некоторой формы пользовательского производного класса asio::streambuf, который разделяет фактический буфер с кольцевым буфером, но сохраняет отдельное состояние указателя чтения без необходимости любого замка.
Мне кажется, это довольно необычная потребность, потому что я не могу найти какую-либо связанную документацию/вопрос, касающийся аналогичной темы, а документация по повышению кажется мне довольно краткой и скудной (см., например: http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/basic_streambuf.html).
Было бы неплохо, если бы кто-нибудь мог указать мне на некоторые идеи, которые я мог бы взять в качестве отправной точки для реализации моего дизайна, или указать мне на альтернативный дизайн, если он / она считает мой плохой, нереализуемый и / или улучшаемый.