У меня есть простой UDP-сервер, созданный с использованием boost\asio
, который на данный момент печатает только полученные данные, как показано ниже.
using boost::asio::ip::udp;
enum { max_length = 2048 };
void server(boost::asio::io_context& io_context, unsigned short port)
{
std::cout << "Server Created on port " + std::to_string(port) << " \n" << std::flush;
udp::socket sock(io_context, udp::endpoint(udp::v4(), port));
while(true)
{
udp::endpoint sender_endpoint;
std::vector<char> v(max_length);
sock.receive_from(boost::asio::buffer(v), sender_endpoint);
for (int i = 0; i < v.size(); i++)
{
std::cout << v[i] <<std::flush;
}
std::cout << std::endl;
}
}
Я создаю 3 потока функции server
, используя boost::thread
, которые я назначаю thread_group
:
boost::asio::io_context io_context;
boost::thread_group tg;
boost::thread *t = new boost::thread(server, std::ref(io_context), 8889);
boost::thread *t1 = new boost::thread(server, std::ref(io_context), 8890);
boost::thread *t2 = new boost::thread(server, std::ref(io_context), 11111);
tg.add_thread(t);
tg.add_thread(t1);
tg.add_thread(t2);
tg.join_all();
Для тестирования сервера я использовал Packet Sender. Проблема в том, что вывод... зашифрован. При отправке пакетов на 3 порта в одно и то же время (более или менее) один раз в секунду вывод немного смещается, но при увеличении частоты пакетов до одного раза в 0,1 секунды вывод становится нечитаемым, как показано на эти два изображения. Я пытался дать один отдельный объект io_context
каждому серверу, но вывод остается одинаковым при высокой частоте. Есть ли способ избежать этого?
io_context
не имеет отношения кstd::cout
. Вам нужно использовать какой-то метод синхронизации, чтобы избежать скремблирования. Например, вы можете использоватьstd::mutex
и заблокировать его при выводе вstd::cout
. - person sklott   schedule 25.02.2020(individual characters output from multiple threads may interleave, but no data races occur)
- person sklott   schedule 25.02.2020