|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.03.2013, 22:12 | #1 |
Форумчанин
Регистрация: 25.08.2010
Сообщений: 258
|
Синхронные, асинхронные, блокирующие, неблокирующие сокеты
Всем привет! Вобщем собственно вопрос: прочетал кучу литературы начиная с сокетов Беркли, ну толком не понял как да что! Насчет блокирующих, неблокирующих понял в чом отличие, а вот в чем разница между неблокирующими и асинхроными не понял. Прошу объяснить мне эту разницу! И самый главный вопрос: практическое применение синхронных, асинхронных сокетов!!! Какой тип лучше выбрать (в моем случае для игрового сервера).Заранее благодарю!
|
22.03.2013, 22:39 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
В неблокирующих само чтение данных произходит синхронно, *после* сигнала о наличии данных. В асинхронных не ждем сигнала о наличии данных и начинаем сразу читать а сигнал посылается после того, как данные будут скопированы в буфер.
При чтении из сокетов разница неощутима, поскольку читаются маленькие блоки. В принципе асинхронные лучше, но там столько много подводных камней, что лучше обычными неблокирующими. |
22.03.2013, 22:49 | #3 |
Форумчанин
Регистрация: 25.08.2010
Сообщений: 258
|
а чем они лучше если не секрет! я просто не вижу разницу! как по мне лучше взять, даже те же блокирующие а всю работу выполнять в ThreadPool чтоб не создать связь клиент-поток! Просто я не знаю как лучше! Ведь на игровом сервере данные от клиентов будут приходить постоянно, тем более что таких клиентов будет много!
Как вы думаете как лучше? |
23.03.2013, 10:22 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Разница в том, что в одном случае приходит сигнал, что есть данные а само чтение все равно блокирущее а во втором случае сигнал приходит только *после* прочтения данных. Иными словами, вы сможете запустить все операции чтения из одного потока одновременно. При работе с сокетами разница несущественна а вот если будет большой объем дисковых операций, тогда асинхронность однозначно лучше.
С блокирующими вам понадобится по два потока на каждого клиента. Если у вас десяток соединений - сойдет, но если речь идет о сотнях а то и больше, тогда уже не самый удачный вариант. |
23.03.2013, 20:38 | #5 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
так это, блокирующий это синоним синхронного, означает, что вызов процедуры на блокирующем объекте не вернет управление вызывающему потоку до полного завершения процедуры. неблокирующий (асинхронный) - означает, что при вызове процедуры на неблокирующем объекте управление будет возвращено управляющему потоку немедленно, независимо от текущего состояния выполнения процедуры.
2waleri я всегда думал, что очередь уже изобретена, поэтому достаточно двух потоков, один на чтение, второй на отправку. Последний раз редактировалось f.hump; 23.03.2013 в 20:48. |
23.03.2013, 22:47 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
При блокирующих сокетах - недостаточно. Работать конечно будет, но наверно если бы этого было достаточно никто бы не парился с select-ом или асинхронным I/O
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
асинхронные вычисления в .Net | Reskov | Общие вопросы .NET | 0 | 05.05.2012 02:27 |
синхронные/асинхронные запросы | Dimarik | JavaScript, Ajax | 2 | 05.09.2010 19:02 |
Не блокирующие сокеты. | profi | Win Api | 3 | 13.03.2010 18:27 |
Сокеты | SL1CK | Общие вопросы C/C++ | 8 | 05.10.2009 13:20 |
Сокеты: блокируемые или асинхронные? | AndreySt | Win Api | 4 | 14.09.2009 18:43 |