сокеты и потоки |
Здравствуйте, гость ( Вход | Регистрация )
сокеты и потоки |
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 |
асинхронное чтение данных (read_handler(...)) для всех сокетов, созданных на сервере, выполняется в том же потоке, что и io_service. Т.е. фактически они все работают в одном потоке. мне кажется, вы не совсем правы. операции выполняются в том же потоке в котором работает io_service::run, поэтому в примерах к asio обычно делают примерно так:
то есть создают новый поток для работы сервиса. З.Ы. дальше есть вариации с несколькими сервисами или их работами в нескольких потоках. как это работает достаточно доходчиво описано в примерах. |
|
|
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 |
В чем причина? вот этого я не знаю возможно что сокет на это не рассчитан. с другой стороны, async_connect при аналогичных обстоятельствах у меня работает. возможно, если ты приведешь участочки кода, ктонибудь тебе подскажет я тут глянул в примеры... там подобная операция производится через io_service::post(), который производит операцию уже на потоке сервиса |
|
|
Текстовая версия | Сейчас: 29.3.2024, 13:33 |