Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
#1

Многопоточный чат с использованием пула потоков - C++

23.03.2014, 19:10. Просмотров 1106. Ответов 20
Метки нет (Все метки)

есть вопрос как реализовать можно чат с использованием пулов потоков.Без пула все понятно на каждого клиента создается поток и потоки висят и делают свои дела,в пуле я читал создается n-ое количество потоков и они обрабатывают свои задачи,тоесть если у меня 4 потока в пуле то только 4 пользователя смогут работать и все,а остальные будут в очереди или я не правильно что то понимаю

Добавлено через 43 минуты
неужели никто не использовал пул потоков?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2014, 19:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многопоточный чат с использованием пула потоков (C++):

Вызов конструктора и деструктора с использованием пула - C++
У меня есть некоторая область памяти (указатель на её начало и размер в байтах), часть которой необходимо превратить в объект. У объекта...

Помощь с использованием потоков - C++
Добрый вечер, вот пишу программу, которая создает 2 потока, первый считает в файле кол-во символов и записывает в файл, второй считает...

Максимальный элемент матрицы с использованием потоков - C++
#include "stdafx.h" #include <Windows.h> #include <iostream> #include <conio.h> using namespace std; int *Mas; struct...

Поиск в бинарном файле с использованием файловых потоков - C++
Подскажите как реализовать поиск объекта в бинарном файле.(телефонный справочник, поиск по названию абонента)

Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи - C++
Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: • конструктор, • деструктор, ...

Создание и завершение процессов и потоков. Приоритеты выполнения потоков - C++
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

20
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.03.2014, 19:21 #2
Цитата Сообщение от sergeu90 Посмотреть сообщение
есть вопрос как реализовать можно чат с использованием пулов потоков
так в чем вопрос? появился клиент - достали из пула поток и отдали его клиенту, если свободного потока нету, поставили клиента в очередь
1
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
23.03.2014, 19:40  [ТС] #3
Jupiter,вопрос возник в том что получается у меня в системе будет только определенное количество пользователей допустим в пуле 10 потоков значит одновременно может быть только 10 клиентов,остальные клиенты подсоеденяются и ждут когда пул потоков обработает их задачу я правильно понял?

Добавлено через 7 минут
Jupiter, получается что по сути лучше использовать на каждого клиента свой поток ?бесконечное количество пользователей будет,а с пулом получается нет?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.03.2014, 19:55 #4
Цитата Сообщение от sergeu90 Посмотреть сообщение
бесконечное количество пользователей будет,а с пулом получается нет?
в ОС есть ограничение на количество потоков на процесс

Цитата Сообщение от sergeu90 Посмотреть сообщение
получается что по сути лучше использовать на каждого клиента свой поток ?
лучше или хуже зависит от количества пользователей, продолжительности задачи каждого пользователя и т.д. и т.п.
1
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
24.03.2014, 17:17  [ТС] #5
Jupiter, просто у меня стоит задача курсового пул потоков,я решил на курсовую сделать чат с использованием пула,может подскажите какую-нибудь идею для курсового с использованием пула потоков?

Добавлено через 21 час 6 минут
никто не подскажет?
0
Убежденный
Ушел с форума
Эксперт С++
15691 / 7201 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
24.03.2014, 21:47 #6
Цитата Сообщение от sergeu90 Посмотреть сообщение
тоесть если у меня 4 потока в пуле то только 4 пользователя смогут работать и все,а остальные будут в очереди или я не правильно что то понимаю
Неправильно понимаете.
Сетевой ввод-вывод по своей природе устроен так, что там
постоянно происходит ожидание выполнения каких-то операций -
пинг, handshake, connect/disconnect, send, receive и т.д.

Пока сетевое оборудование занимается обработкой операции,
поток разгружается и может взять на себя еще что-нибудь.
Например, обработать результат операции, которая только
что завершилась. После чего поток снова "возвращается" в пул.

То есть, небольшое количество потоков легко могут обслуживать
десятки и сотни клиентов, а иногда на порядки больше.
1
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
24.03.2014, 22:34  [ТС] #7
Убежденный, ну это я понимаю что операция завершилась поток освободился можно взять другую задачу,а если у меня допустим 4 потока будут висеть все время и в бесконечном цикле крутиться пока клиент не дисконект то получится что очередь все таки будет
0
Убежденный
Ушел с форума
Эксперт С++
15691 / 7201 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
24.03.2014, 23:05 #8
Хм. А что именно будут делать эти потоки в бесконечном цикле ?
И главное - зачем ?
1
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
25.03.2014, 01:18  [ТС] #9
Убежденный, они будут ждать от клиента действий и опять зысыпать,а как чат сделать тогда иначе?
0
Убежденный
Ушел с форума
Эксперт С++
15691 / 7201 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
25.03.2014, 09:25 #10
sergeu90, очень советую - найдите книгу "Программирование в
сетях Windows", почитайте в ней главу про модели сокетного ввода-вывода,
особенно что касается портов завершения (IOCP). Там вовсю
используются пулы потоков и характерные "примочки", которые с
ними связаны. Многие такие вопросы сами собой отпадут.
2
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 10:32 #11
Цитата Сообщение от sergeu90 Посмотреть сообщение
они будут ждать от клиента действий и опять зысыпать,а как чат сделать тогда иначе?
использовать асинхронный ввод вывод, а не в цикле ждать когда удаленная сторона что то сделает,
на сокете появилась активность на чтение - читаем
писать как правило можно всегда, во время дисконнекта по моим наблюдениям появляется активность на чтение, но recv вернет 0 (0 может вернуть и в других ситуациях, важно при получении 0 байт проверить значение errno/WSAGetLastError())
0
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
25.03.2014, 13:34  [ТС] #12
aLarman, ну я трошки не понимаю,как сделать асинхронный ввод вывод,я так и собирался делать в цикле бесконечном ждать активности от клиента,а как вот сделать иначе сложно)

Добавлено через 1 минуту
Убежденный, спасибо буду пробывать читать хотя до сих не понимаю как реализовать логику чата,что бы каждый поток не висел в бесконечном цикле
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 13:41 #13
Цитата Сообщение от sergeu90 Посмотреть сообщение
а как вот сделать иначе сложно
почитайте про ф-ции select и poll (linux), и есть аналог select'a в винде (называется вроде так же)
в 2х словах, в эти ф-ции передаются дескрипторы (cокеты в вашем случае) и эти дескрипторы проверяются на активность (на чтение на запись на ошибки), и этот метод возвращает управление если есть хотя бы 1 активность, или после таймайта
на запись практически всегда будет активность (потому что писать можно практически всегда - забить буфер сложно, а ошибочные ситуации рассматривать не будем) поэтому достаточно проверять активность на чтение
соответственно как появилась активность на чтение даем задачу пулу обработать эту активность (вычитать данные), в данном случае если есть активность, то вызов recv не будет блокирующим
после чего делаем какие то действия с полученными данными, каким то образом реагируем на эти данные (возможно вызов какой то ф-ции) и поток завершает работу (точнее начинает ждать новой задачи)
что получается - есть что читать - читаем, нет ничего - простой, а опрашивать в цикле данные не стоит
0
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
25.03.2014, 13:44  [ТС] #14
aLarman, и как тогда со стороны клиента держать соеденение что бы не отсоеденяться от сервера,так я делал что бы в потоке на сервере бесконечно крутился цикл и тогда клиент у меня не терялся тоесть не дисконектился

Добавлено через 1 минуту
aLarman, а можно пример кода примитивный самый простой что бы понять как это выглядит так сложно разобраться,ели не сложно не большой пример
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 13:45 #15
Цитата Сообщение от sergeu90 Посмотреть сообщение
и как тогда со стороны клиента держать соеденение что бы не отсоеденяться от сервера
что Вы планируете использовать? UDP или TCP
0
25.03.2014, 13:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2014, 13:45
Привет! Вот еще темы с ответами:

Создать многопоточный таймер - C++
Мне надо создать многопоточный таймер,говоря иначе,мне надо,чтобы запускался таймер,а ты мог еще что-то делать в это...

Многопоточный обход графа в глубину - C++
Доброго времени суток. Подскажите многопоточный алгоритм обхода графа в глубину (нужно распараллелить алгоритм поиска компонент связности)....

Сервер с использованием пула потоков для параллельной обработки запросов клиентов - C#
Разработать сервер с использованием пула потоков для параллельной обработки запросов клиентов. К серверу подключается много клиентов, все...

Синхронизация пула потоков - C#
Всем привет! Задаю я, наверное, такой вопрос не первый и уж явно не последний. Тема такая: using (ManualResetEvent mre = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru