Я хочу записать простое серверное приложение, которое возьмет команды от клиентского приложения и выполнит те команды в отдельных потоках.
Я смотрел на класс сервера в dlib. У кого-либо есть опыт с помощью этого? Как это выдерживает сравнение с использованием Asio Повышения?
Boost Asio сделает это довольно легко. Взгляните на примеры в учебнике Highscore , в котором показано, как использовать Boost для асинхронного ввода / вывода с многопоточностью.
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream>
void handler1(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
void handler2(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
}
boost::asio::io_service io_service;
void run()
{
io_service.run();
}
int main()
{
boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5));
timer1.async_wait(handler1);
boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(5));
timer2.async_wait(handler2);
boost::thread thread1(run);
boost::thread thread2(run);
thread1.join();
thread2.join();
}
Я бы сначала попробовал не использовать потоки. Я бы начал с libevent . Вы обнаружите, что модель libevent чрезвычайно проста и масштабируется намного лучше, чем порождение потока по модели запроса . И если libevent не может справиться с вашим вариантом использования, всегда есть Erlang!
Асинхронный ввод-вывод во многих отношениях лучше, чем модель «поток на клиент». Оптимальная производительность фактически достигается за счет потока на ядро, когда каждый поток выполняет асинхронный ввод-вывод.
Обратите внимание, что ваша концепция «многопоточного сервера», хотя и не совсем ошибочна, сильно отличается от того, что все остальные используют для обозначения этой фразы. Обычно это означает один поток на соединение, а не ответ на одно соединение, распараллеленное между потоками.
Пример, который вы просите, представляет собой просто комбинацию однопоточного синхронного сервера + параллельных вычислений.