Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 1 socket + 2 thread = где идет обслуживание? не совсем понимаю 
V
    Опции темы
null56
Дата 19.5.2010, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Всем привет
Возникла задача, а вместе с ней непонимание распределения работы по обслуживанию сокета между потоками.
Задача(ключевые моменты):
Есть два потока. В первичном создается сокет (accept), далее работа между потоками распределяется: основной (первичный) поток читает данные(recv) из сокета и отправляет в пайп, дочерний поток читает данные из пайпа и оптравляет в сеть через сокет (send).
Сокет работает в неблокируемом режиме. В основном потоке дейтсвие приостанавливает select, который будится при появлении данных во внутреннем буфере сокета, в дочернем работа приостанавливается за счет блокируемого чтения из пайпа
Приблизительно это выглядит так
Поток 1
Код

...
select(readfd, 0, 0, timeout);
if (FD_ISSET(sock, readfd))
{
 recv(sock, ...);
 WriteFile(pipe, ...);
}
...


Поток 2
Код

ReadFile(pipe, ...)
send(sock, ...);


Что именно заинтересовало:
Почему данные отпраляемые из дочернего потока (поток 2), отправляются только при пробуждении первичного потока? иными словами, в дочернем потоке я хоть и делаю send, ощущение такое, что за передачу сетевой подсистеме отправляемых данных отвечает всё равно поток родитель сокета... или я ошибаюсь?

Заранее благодарен за помощь, надеюсь вопрос понятен....
PM MAIL   Вверх
GoldFinch
Дата 19.5.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



null56, кто поток блокирует, тот и передает
PM MAIL ICQ   Вверх
null56
Дата 19.5.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



а recv и send взаимноблокируемы?

Добавлено через 4 минуты и 3 секунды
в смысле получается так, select блокирует send и пока я не выйду из ожидания события, вторичный поток не отработает send? и наоборот
PM MAIL   Вверх
GremlinProg
Дата 20.5.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
null56
Дата 20.5.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



GoldFinch, да, ты прав, каждый поток выполняет свою часть работы по сокету, но идет взаимоисключающая блокировка  операций send/recv
спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.