Асинхронная запись данных из streambuf при добавлении к нему - PullRequest
0 голосов
/ 23 ноября 2018

Мне нравится реализовывать поток «запускай и забывай», где я могу асинхронно добавлять данные, которые должны быть записаны во время записи.Можно ли безопасно использовать asio::streambuf для этого?

asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;

// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
    send_buffer.sputn(data, size);
    flush();
}

void flush() {
    if (flushing || send_buffer.size() == 0) return;
    flushing = true;
    asio::async_write(socket, send_buffer, [&](auto, auto) {
        // error handling
        // as per doc data is consumed from the buffer automatically
        flushing = false;
        flush(); // not sure if this even needs to be called
    });
}

Хотя время жизни самого streambuf очевидно, я обеспокоен тем, что добавление новых данных сделает недействительными любые буферы, которые просматривают его память.Было бы найти, если это изолированные внутри обработчиков, но я не могу найти какую-либо документацию относительно того, правда это или нет.

Кажется, что

socket.async_write_some(send_buffer, [](auto, auto){});

не работает вообще, для этого потребуется send_buffer.data() - что будет недействительно при операциях на send_buffer, как это задокументировано.

Я также рассмотрел asio::buffered_write_stream, но, похоже, он не предоставляет простой способ выгрузки данныхгарантированным неблокирующим способом.

Основными сокетами являются сокеты tcp и ssl.Все обработчики выполняются в одной цепочке.

...