Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739

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

23.03.2014, 19:10. Показов 6039. Ответов 55
Метки нет (Все метки)

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

Добавлено через 43 минуты
неужели никто не использовал пул потоков?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2014, 19:10
Ответы с готовыми решениями:

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

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

Обработка матриц с использованием файлов и потоков
Задание такое: Создать класс matrica с заранее неизвестным количеством элементов. Предусмотреть члены-функции: 1) Введение с файла...

55
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.11.2022, 16:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Optimus11 Посмотреть сообщение
Спасибо, однако таки не понятно, каким образом "запихнуть" бустовский сокет в этот пул памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
inline pool_allocator<boost::asio::ip::tcp::socket> alloc;
 
template <typename ...Args>
boost::asio::ip::tcp::socket* new_socket(Args && ...args) {
    using boost::asio::ip::tcp::socket;
 
    void* mem = alloc.allocate(sizeof(socket));
    return ::new(mem) socket(std::forward<Args>(args)...);
}
 
void delete_socket(boost::asio::ip::tcp::socket* sock) {
    using boost::asio::ip::tcp::socket;
    sock->~socket();
    alloc.deallocate(sock);
}
Добавлено через 5 минут
Цитата Сообщение от Optimus11 Посмотреть сообщение
Укажите пожалуйста на проблему.
Как мне видится, что проблема сейчас в том, что вы не определились точно что вы хотите, придумываете проблемы, и пытаетесь с ними бороться. Фрагментация, которую вы выше упомянули - это проблема несуществующая на том этапе создания программы, на котором находитесь вы. Нужно сперва доказать, что она вообще есть.

Так что я предостерегаю от превратного понимания моих советов в этой теме. Они даны лишь для расширения, вашего и всех заинтересованных, кругозора, а не как руководство к действию. Так следует относиться вообще ко всем моим ответам на этом форуме. А то, я последняя время стал замечать, что не всем это очевидно.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 17:34
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я такие объекты еще на паскале в обычный массив ложил.
У вас проблема не в этом.
А Вы на С или С++ - положите
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 18:06
Цитата Сообщение от Optimus11 Посмотреть сообщение
А Вы на С или С++ - положите
Да хоть свой контейнер напишу для таких объектов.
DrOffset, уже привел вам пример и пула и размещающий new
Что вам еще нужно, вы же не слушаете
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 19:28
Цитата Сообщение от SmallEvil Посмотреть сообщение
Да хоть свой контейнер напишу для таких объектов.
DrOffset, уже привел вам пример и пула и размещающий new
Что вам еще нужно, вы же не слушаете
Я ни в коем случае не против того, что привел DrOffset.
Но Вы так на С/C++ и не положили
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 19:40
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но Вы так на С/C++ и не положили
Потому что я ленивая жопа, хочу ложу, хочу не ложу.
Или вы думаете меня на "слабо" взять ?

Добавлено через 44 секунды
Optimus11, вся суть в том, что это вам ничем не поможет.
Ровно так же, как и примеры от DrOffset .

Добавлено через 9 минут
Я в душе не чаю что там у вас за пулы, чат и тиктоки.
Я вижу что ваша проблема в том, что вы не умеете работать с объектами классов с ограниченным набором специальных членов. Которые накладывают ограничения на их использование.
То есть, без конструктора по умолчанию, с запрещенным копированием, перемещением объектов.

А вы тут рассказываете всем про фрагментацию памяти.
Берем "книжку для чайников", и учимся работать с такими объектами.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 20:40
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я вижу что ваша проблема в том, что вы не умеете работать с объектами классов с ограниченным набором специальных членов. Которые накладывают ограничения на их использование.
То есть, без конструктора по умолчанию, с запрещенным копированием, перемещением объектов.
Именно так.
Вообще не пойму, как с ними работать.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.11.2022, 21:16
Цитата Сообщение от Optimus11 Посмотреть сообщение
my_vec[0] = boost::asio::ip::tcp::socket(io_context) ; //Так нельзя, так как буст сокет не поддерживает конструктор копирования
Вообще говоря так можно, т.к. у класса есть конструктор перемещения и оператор перемещения. Если у вас не работает это, то вероятно у вас старая версия буста, либо вы используете С++03.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 21:49
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще говоря так можно, т.к. у класса есть конструктор перемещения и оператор перемещения. Если у вас не работает это, то вероятно у вас старая версия буста, либо вы используете С++03.
Я использую с++17. И Visual Studio 2022 - так и пишет, что отсутствует конструктор копирования.

Добавлено через 13 минут
Версия буста последняя - позавчера скаченная.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.11.2022, 22:43
Цитата Сообщение от Optimus11 Посмотреть сообщение
Я использую с++17. И Visual Studio 2022 - так и пишет, что отсутствует конструктор копирования.
Вот код. Он работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <vector>
 
int main()
{
    using boost::asio::ip::tcp;
    
    boost::asio::io_service io_service;
    
    std::vector<tcp::socket> sockets;
    sockets.emplace_back(io_service, tcp::v4());
    
    sockets[0] = tcp::socket(io_service); // работает
}
Пруф 1: https://rextester.com/GNH70776
Пруф 2: https://www.boost.org/doc/libs... ocket.html
Пруф 3: https://www.boost.org/doc/libs... r_eq_.html

Напомню вашу цитату:
Цитата Сообщение от Optimus11 Посмотреть сообщение
C++
1
my_vec[0] = boost::asio::ip::tcp::socket(io_context); //Так нельзя, так как буст сокет не поддерживает конструктор копирования
Да, именно этот код будет работать. Если у вас не работает, и при этом у вас С++17 и последняя версия буста, то у вас другой код. Другой. Внимательно смотрите и проверяйте.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 22:57
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот код. Он работает.

Да, именно этот код будет работать. Если у вас не работает, и при этом у вас С++17 и последняя версия буста, то у вас другой код. Другой. Внимательно смотрите и проверяйте.
Вот скриншот студии:

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.11.2022, 22:59
Цитата Сообщение от Optimus11 Посмотреть сообщение
Вот скриншот студии:
И? Это другая ошибка. Ошибка про конструктор по умолчанию (из-за resize), а не про конструктор копирования.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 23:10
Цитата Сообщение от DrOffset Посмотреть сообщение
И? Это другая ошибка. Ошибка про конструктор по умолчанию (из-за resize), а не про конструктор копирования.
Я уже совсем запутался. Да, если сделать push_back, а потом на это место заменить boost::socket - работает.
Если resize не работает, то теперь я не понимаю, как собственно работает push_back - внутри. Думал понимаю, теперь понял, что не понимаю.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.11.2022, 23:21
Цитата Сообщение от Optimus11 Посмотреть сообщение
как собственно работает push_back - внутри.
Если памяти хватает, то создает в ней новый объект.
Если памяти не хватает, то увеличивает ее, выделяя новый непрерывный кусок, копирует или перемещает туда существующие объекты (копирующее или перемещающее конструирование новых объектов) из старой памяти и создает еще один новый объект в свободном месте. Объекты в старой памяти уничтожаются, затем старая память освобождается.

Добавлено через 2 минуты
Цитата Сообщение от Optimus11 Посмотреть сообщение
resize не работает
resize выделяет память и создает в ней объекты используя конструктор по умолчанию. У сокета из буста такого конструктора нет, поэтому и не работает.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.11.2022, 23:39
Цитата Сообщение от DrOffset Посмотреть сообщение
Если памяти хватает, то создает в ней новый объект.
Если памяти не хватает, то увеличивает ее, выделяя новый непрерывный кусок, копирует или перемещает туда существующие объекты (копирующее или перемещающее конструирование новых объектов) из старой памяти и создает еще один новый объект в свободном месте. Объекты в старой памяти уничтожаются, затем старая память освобождается.

resize выделяет память и создает в ней объекты используя конструктор по умолчанию. У сокета из буста такого конструктора нет, поэтому и не работает.
Но ведь push_back, когда памяти под новый элемент не хватает - вероятнее всего делает resize/realloc - и это, как то работает.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.11.2022, 00:07
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но ведь push_back, когда памяти под новый элемент не хватает - вероятнее всего делает resize/realloc - и это, как то работает.
Я написал что он делает. Почему нужно повторять?
Он выделяет новый непрерывный кусок, копирующим или перемещающим конструированием создает в нем столько объектов, сколько было в старом куске, затем создает еще один объект, который был запрошен через push_back. В старом куске памяти объекты уничтожаются, а сам кусок освобождается.

Добавлено через 3 минуты
resize - это точно такая же высокоуровневая операция, как и push_back.
Внутри resize использует тот же описанный выше механизм, только в дополнительно выделенной памяти объекты создаются конструктором по умолчанию. Уже существующие объекты, при увеличении размера, точно также копирующим\перемещающим конструированием воссоздаются в новой памяти.

Добавлено через 9 минут
Optimus11, удивительно, но когда я писал этот ответ, меня не покидало ощущение, что все это мы уже проходили. И точно, вот тема 2021 года, где это уже разъяснялось:
Нарушении прав доступа к указателю на структуру
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
07.11.2022, 01:22
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но ведь push_back, когда памяти под новый элемент не хватает - вероятнее всего делает resize/realloc - и это, как то работает.
делает reserve, а не resize.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2022, 01:22

Максимальный элемент матрицы с использованием потоков
#include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int *Mas; struct...

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

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

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

Ожидание завершения пула потоков
Нужно чтоб результат этого кода возвращался по завершению выполнения всех потоков в пуле ExecutorService exService =...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 28.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 28.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru