В настоящее время я использую 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.
Поскольку отправка выполняется асинхронно, буфер должен оставаться неизменным на протяжении всего времени. Я не могу так сказать из вашего кода, например, использование глобальной переменной некорректно. Что произойдет с двумя посылками одновременно? Также, get_buffer_for_send()
не показано, это может содержать проблемы тоже.
Других решений пока нет …