Простой многопоточный сервер в C++?

Я хочу записать простое серверное приложение, которое возьмет команды от клиентского приложения и выполнит те команды в отдельных потоках.

Я смотрел на класс сервера в dlib. У кого-либо есть опыт с помощью этого? Как это выдерживает сравнение с использованием Asio Повышения?

5
задан griffin 16 July 2010 в 02:54
поделиться

3 ответа

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(); 
}
4
ответ дан 14 December 2019 в 01:00
поделиться

Я бы сначала попробовал не использовать потоки. Я бы начал с libevent . Вы обнаружите, что модель libevent чрезвычайно проста и масштабируется намного лучше, чем порождение потока по модели запроса . И если libevent не может справиться с вашим вариантом использования, всегда есть Erlang!

3
ответ дан 14 December 2019 в 01:00
поделиться

Асинхронный ввод-вывод во многих отношениях лучше, чем модель «поток на клиент». Оптимальная производительность фактически достигается за счет потока на ядро, когда каждый поток выполняет асинхронный ввод-вывод.

Обратите внимание, что ваша концепция «многопоточного сервера», хотя и не совсем ошибочна, сильно отличается от того, что все остальные используют для обозначения этой фразы. Обычно это означает один поток на соединение, а не ответ на одно соединение, распараллеленное между потоками.

Пример, который вы просите, представляет собой просто комбинацию однопоточного синхронного сервера + параллельных вычислений.

2
ответ дан 14 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: