Как я могу получить теги документов эластичного поиска со ссылкой на их документ?

Похоже, этот вопрос сводится к следующему:

, что происходит, когда async_write_some() вызывается одновременно в одном сокете из двух разных потоков

Я считаю, что это точно операция, которая не является потокобезопасной. Порядок, в котором эти буферы выходят на провод, не определен, и они могут быть чередующимися. Особенно, если вы используете функцию удобства async_write(), так как она реализована как серия вызовов async_write_some() внизу, пока не будет отправлен весь буфер. В этом случае каждый фрагмент, который отправляется из двух потоков, может чередоваться случайным образом.

Единственный способ защитить вас от удара этого случая - это построить вашу программу, чтобы избежать подобных ситуаций.

Один из способов сделать это - написать буфер отправки прикладного уровня, который один поток отвечает за нажатие на сокет. Таким образом, вы можете защитить только буфер отправки. Имейте в виду, что простой std::vector не будет работать, так как добавление байтов в конец может привести к перераспределению его, возможно, пока есть выдающийся async_write_some(), ссылающийся на него. Вместо этого, вероятно, неплохо использовать связанный список буферов и использовать функцию разброса / сбора asio.

0
задан dlamblin 20 March 2019 в 10:39
поделиться