2012-06-13 1 views
7

У меня мало опыта в boost::asio. У меня есть довольно простые вопросы.Нужно ли нам несколько io_service на поток для потокового boost :: asio-сервера с одним акцептором

мне нужно иметь различный io_service и другой socket под другим thread но один одиночный acceptor, обрабатывать клиент в резьбовом сервере?

Я считаю, что у меня должен быть другой сокет для нового клиента. Но если все потоки будут использовать тот же самый io_service, будет ли он параллельным?

Я прошел через http://en.highscore.de/cpp/boost/index.html в разделе asio , в котором говорится, что для достижения параллелизма мне нужно иметь разные io_services в разных потоках.

я, если я планирую сделать класс сервера, который создает new TCPsession каждый раз, когда появляется новый клиент в acceptor.async_accept
и TCPSession т е р создает io_service и thread и бежит, что io_service.run() в своем собственном потоке это будет хороший дизайн ?

Однако в этом дизайне, где бы я присоединился ко всем этим темам? мне нужен еще io_service для main, чтобы он не прекращался даже до получения нового Клиента?

ответ

8

Одиночный io_service, работающий в одном потоке, может обслуживать все объекты asio в вашем проекте. В такой конструкции i/o все равно будет «параллельным» в том смысле, что он неблокируется, асинхронен; но так как io_service::run() запускается в одном потоке, все обработчики завершения будут вызываться последовательно, один за другим.

Чтобы масштабировать свой сетевой модуль на нескольких процессорах, вы можете использовать один из двух подходов: thread-per-core, io_service-for-core - см. HTTPServer2 and HTTPServer3 examples.

В любом случае, создание потока или io_service за TCPSession мне кажется ненужной голова - думать о том случае, когда вы получили тысячи TCPSession с ...

+0

Тогда какая за сеансовые потоки делать? например не должен ли я иметь один сеанс в одном потоке? чтобы каждый сеанс был параллельным? Однако у меня должно быть 5 одновременных сессий одновременно. Хотя я хотел бы знать решение общего назначения –

+0

Нет, вам это не нужно. Прочтите следующее: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/core/async.html. Единственный случай, когда вам понадобятся дополнительные потоки, - это то, что обработчики завершения TCPSession слишком тяжелы (например, выполняют трудоемкие операции с БД или так). Но тогда ваше приложение не будет масштабируемым в любом случае, поэтому вам придется изменить дизайн, чтобы разделить или переместить некоторую работу из обработчиков завершения. –

+0

Итак, если у меня только разный сокет за сеанс, все будет хорошо? и могу ли я сначала развить все это в одном потоке? а затем переключиться на несколько потоков? –

Смежные вопросы