boost :: async_write вызывает повреждение данных

В настоящее время я использую boost :: async_write для отправки буфера большого размера (около 50 КБ) один раз. В результате я получаю около одного поврежденного буфера из каждых 20 буферов на стороне сервера.

Мой код такой. Обработка ошибок и другие детали опущены:

bool socket_available = true;
const_buffer *buffer;

// will be called frequently in a while loop in thread A
void send_buffer()
{
scope_lock l(mutex);
if (!socket_available) return;

socket_available = false;
buffer = get_buffer_for_send();   // The size is about 50KB
boost::asio::async_write(
socket, buffer,
boost::bind(handle_write_request, boost::asio::placeholders::error)
);
}

// will be called in thread B which runs io_service::run
void handle_write_request(const boost::system::error_code& error_code)
{
scope_lock l(mutex);
socket_available = true;
free_buffer(buffer);
}

Я считаю, что я правильно использую async_write, потому что я вызываю async_write только один раз после вызова обработчика (http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html). Однако данные по-прежнему чередуются во время отправки.

Я знаю, что обычный способ сделать это — поместить async_write в обработчик, чтобы они оба вызывались в одном потоке. И когда я делаю это, никакого повреждения данных не происходит снова. Поэтому мне просто интересно, почему приведенный выше код не будет работать так, как ожидалось.

Спасибо за ваше время и советы. Кстати, я использую boost 1.54.0 под win 7.

3

Решение

Поскольку отправка выполняется асинхронно, буфер должен оставаться неизменным на протяжении всего времени. Я не могу так сказать из вашего кода, например, использование глобальной переменной некорректно. Что произойдет с двумя посылками одновременно? Также, get_buffer_for_send() не показано, это может содержать проблемы тоже.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]