Простой многопоточный сервер на C ++? - PullRequest
5 голосов
/ 16 июля 2010

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

Я искал серверный класс в dlib . У кого-нибудь есть опыт использования этого? Как это по сравнению с использованием Boost's Asio?

Ответы [ 3 ]

4 голосов
/ 18 июля 2010

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(); 
}
3 голосов
/ 16 июля 2010

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

2 голосов
/ 16 июля 2010

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

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

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

...