crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> сокеты и потоки
kas
  опции профиля:
сообщение 29.12.2010, 20:57
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 16.6.2010
Пользователь №: 1813

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток!
Начал разбираться с boost::asio и для примера написал простой клиент и сервер. Клиент в асинхронном режиме отправляет на сервер файл, а сервер принимает данные (асинхронно) и сохраняет их. Все хорошо и все работает. Но асинхронное чтение данных (read_handler(...)) для всех сокетов, созданных на сервере, выполняется в том же потоке, что и io_service. Т.е. фактически они все работают в одном потоке.
Мне необходимо чтобы каждое соединение обрабатывалось в своем потоке. Писал подобные вещи с использование Qt, разобрался без проблем. А вот для boost-а никак не получается. Если кто то разбирался с подобной задачей, какие есть варианты ее реализации? Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kilkinenator
  опции профиля:
сообщение 18.1.2011, 14:48
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 11.2.2010
Пользователь №: 1464

Спасибо сказали: 3 раз(а)




Репутация:   1  


Цитата(kas @ 29.12.2010, 20:57) *
асинхронное чтение данных (read_handler(...)) для всех сокетов, созданных на сервере, выполняется в том же потоке, что и io_service. Т.е. фактически они все работают в одном потоке.

мне кажется, вы не совсем правы. операции выполняются в том же потоке в котором работает io_service::run, поэтому в примерах к asio обычно делают примерно так:
boost::asio::io_service service;
boost::thread t(boost::bind(&boost::asio::io_service::run, &service));

то есть создают новый поток для работы сервиса.

З.Ы. дальше есть вариации с несколькими сервисами или их работами в нескольких потоках. как это работает достаточно доходчиво описано в примерах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kas
  опции профиля:
сообщение 20.1.2011, 13:45
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 16.6.2010
Пользователь №: 1813

Спасибо сказали: 0 раз(а)




Репутация:   0  


kilkinenator, большое спасибо что откликнулся.
Для сервиса я создаю отдельный поток, как ты написал.
Меня интересует еще вот такой вопрос :
когда для tcp сокета вызывается tcp::socket::async_read_some(...) из потока в котором работает io_service - все хорошо, а когда я делаю тоже самое из другого потока (у нас там QThread) - read_handler(...) не вызывается. В чем причина?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kilkinenator
  опции профиля:
сообщение 21.1.2011, 15:51
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 11.2.2010
Пользователь №: 1464

Спасибо сказали: 3 раз(а)




Репутация:   1  


Цитата(kas @ 20.1.2011, 13:45) *
В чем причина?


вот этого я не знаю :( возможно что сокет на это не рассчитан. с другой стороны, async_connect при аналогичных обстоятельствах у меня работает.
возможно, если ты приведешь участочки кода, ктонибудь тебе подскажет :)


я тут глянул в примеры... там подобная операция производится через io_service::post(), который производит операцию уже на потоке сервиса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2020, 15:46