Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/55: Рейтинг темы: голосов - 55, средняя оценка - 4.78
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Потоки и асинхронность

25.03.2019, 11:47. Показов 12642. Ответов 100

Студворк — интернет-сервис помощи студентам
Если есть сервер то для каждого клиента было бы логично создавать отдельный поток,но проблема в том что это очень ресурснозатратно,каким образом сделать чтобы не создавать много потоков?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2019, 11:47
Ответы с готовыми решениями:

Потоки. Асинхронность
Уважаемые специалисты, помогите пожалуйста с определениями, прошу не давать ссылки на msdn, потому что уже все там перечитал, но вникнуть...

Потоки и асинхронность для бота в телеграмме
Здравствуйте! В двух словах, что делаю: пишу бота, играющего в города для telegram. Но вот проблема: все пользователи, пишущие боту,...

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

100
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 17:10  [ТС]
Студворк — интернет-сервис помощи студентам
Kastaneda, а мне что делать?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.03.2019, 17:28
Цитата Сообщение от ReYalp Посмотреть сообщение
Kastaneda, а мне что делать?
Изучать азы

Если действительно нужно прямо срочно, то посмотри на уже упомянутый boost::asio, разберись с ней без спешки, разбери до деталей примеры. Не пытайся пока понять разницу между асинхронностью и параллельностью, как показывает практика для начинающих это сложно. Покури бустовые мануалы, посмотри на паттерн Event loop (начать можно отсюда)
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
25.03.2019, 17:53
Цитата Сообщение от ReYalp Посмотреть сообщение
это же не то же самое что я просто пока выполняется метод accept() буду создавать отдельный поток для каждого клиента и там обрабатывать его запросы пока он не отключится?
По сути - почти тоже самое.
Отличие в том, что вам не нужно самому думать о нюансах работы с тредами.
Ася возьмет всю эту рутину на себя.

Например, асинхронное подключение к сокету в асе выглядит так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void connect_handler(const boost::system::error_code & ec)
{
    // here we know we connected successfully
    // if ec indicates success 
}
 
 
int main()
{
    using boost::asio;
    io_service service;
    ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001);
    ip::tcp::socket sock(service);
 
    // вызов не блокирующий. 
    // то есть, здесь поток не ждет полного завершения процедуры "подключения"
    sock.async_connect(ep, connect_handler);
 
    // а сразу продолжает выполнение дальше
 
    service.run();
    ... // здесь делаем что хотим
}
Когда завершиться процедура connect, будет запущена функция connect_handler,
И таким образом вам сообщат что connect завершился.

Вам (пользователю) при этом не нужно думать самому, как это все устроенно внутри.
Вам не нужно думать ни о каких потоках, ни о чем таком.

Вы просто указываете функцию-коллбек, и когда работа завершена - вам сообщают.
Все остальное время можете в своей программе делать какие угодно свои дела.

В этой простоте использования вся суть "асинхронного дизайна".
--------------------------------------------------------------------------------

Некоторые люди любят приводить асю в качестве примера "асинхронного дизайна".
И она действительно предоставляет такие возможности.

Вот только они почему то думают, будто бы она это делает по волшебству.
На самом деле, ася - ни что иное, как сложно замороченный тред-пул.

И хотя обычно, асю используют для высокоуровневой работы с сокетами,
ничто не мешает использовать её именно как тред-пул:

https://rextester.com/YEW86244

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define _WIN32_WINNT 0x0501
    
#include <boost/asio/io_service.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
 
// функция, которая должна исполнять какую либо задачу.
// для примера пусть просто выводит текст в консоль
void myTask(const char* msg)
{
    std::cout << msg << '\n';
}
 
int main()
{
//-------------------------------------------------------------------
    // --- функциональность тред-пула
    
    boost::asio::io_service ioService;
    boost::thread_group threadpool;
    boost::asio::io_service::work work(ioService);
 
    // забиваем пулл рабочими тредами
    // обычно - по количеству ядер процессора
    const auto cpu_count 
        = boost::thread::hardware_concurrency();
 
    for(size_t n = 0; n!=cpu_count; ++n)
        threadpool.create_thread(
            boost::bind(&boost::asio::io_service::run, &ioService)
        );
//-------------------------------------------------------------------
    
    // нагружаем тред задачами
    for(size_t n = 0; n!=10;++n)
        ioService.post(boost::bind(myTask, "Hello World!"));
 
    // останавливаем пулл
    ioService.stop();
    
    // ждем когда все треды остановятся
    threadpool.join_all();    
}
Здесь в качестве myTask можно описывать любую свою логику.
Она будет исполняться "где то в отдельном потоке".
И можно не заморачиваться, как их создавать/останавливать.
И как будет балансироваться нагрузка задач между тредами.

Цитата Сообщение от ReYalp Посмотреть сообщение
как сделать так чтобы после подключения нового клиента(accept() > 0),с сервера могли постоянно отправяться сообщения и так же приниматься от клиента,чтобы это все делалось до тех пор пока не клиент не отключиться?
Забейте на многопоточность.
Сначала реализуйте эту схему хотя бы в режиме "один клиент - один сервер".
Потому что вы пытаетесь сделать это на голых сокетах-беркли.
Там одной только писанины на целый вечер.

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

Добавлено через 3 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
Да ну, неужели нельзя прервать работу таски/функции которая ждет на что-то долго и пока она ждет, заняться более полезной работой, а потом вернуться к ее исполнению и продолжить?
Зачем это нужно?
Зачем нужно прерывать работу важной процедуры?
Где логика?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 18:02
Цитата Сообщение от eva2326 Посмотреть сообщение
C++
1
boost::thread_group threadpool;
А почему не
C++
1
boost::asio::thread_pool pool(4);
?
Цитата Сообщение от eva2326 Посмотреть сообщение
Зачем это нужно?
Зачем нужно прерывать работу важной процедуры?
Где логика?
Окей.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
25.03.2019, 18:19
Цитата Сообщение от Kastaneda Посмотреть сообщение
Где у меня в коде создание потоков?
Вы это так пишете, будто бы показывали какой то код.

Добавлено через 6 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Задача создает другую задачу, которая называется "дай мне список файлов на диске, ответ отдаешь через этот калбек", добавляет эту задачу в очередь, сама прекращает выполнятся. Когда-нибудь очередь доходит до этой новой задачи, она получается список файлов на диске, создает новую задачу "позвать калбек вот с этими аргументами" и добавляет ее в очередь. Первая задача наконец-то получает свой список файлов асинхронно.
Еще раз - вы путаете асинхронность и параллелизм.
Это вы путаете "асинхронный дизайн" с обычным "эвент-лупом".

И вообще, описали "событийно управляемую модель",
а вовсе не "асинхронный дизайн".

Главный смысл асинхронки: задачи выполняются в фоне,
в то время как процесс может свободно заниматься чем то ещё.

Если ваш процесс вынужден крутить дуратский эвент-луп не может заниматься чем угодно,
пока задачи выполняются в фоне - значит у вас уже не асинхронный дизайн.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.03.2019, 18:24
Цитата Сообщение от eva2326 Посмотреть сообщение
Если ваш процесс вынужден крутить дуратский эвент-луп не может заниматься чем угодно,
пока задачи выполняются в фоне - значит у вас уже не асинхронный дизайн.
Значит у boost::asio не асинхронный дизайн?
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
25.03.2019, 18:29
Цитата Сообщение от eva2326 Посмотреть сообщение
Некоторые люди любят приводить асю в качестве примера "асинхронного дизайна".
И она действительно предоставляет такие возможности.
Вот только они почему то думают, будто бы она это делает по волшебству.
На самом деле, ася - ни что иное, как сложно замороченный тред-пул.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Значит у boost::asio не асинхронный дизайн?
...
Миниатюры
Потоки и асинхронность  
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.03.2019, 19:02
eva2326, ваши слова
Если ваш процесс вынужден крутить дуратский эвент-луп не может заниматься чем угодно,
пока задачи выполняются в фоне - значит у вас уже не асинхронный дизайн.
?
Но ведь boost::asio так и устроена - она крутит эвент луп пока выполняются задачи, согласно вашим словам у boost::asio не асинхронный дизайн.
Почему такая реакция на свои же слова?
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
25.03.2019, 19:52
Цитата Сообщение от Kastaneda Посмотреть сообщение
Но ведь boost::asio так и устроена - она крутит эвент луп пока выполняются задачи, согласно вашим словам у boost::asio не асинхронный дизайн.


Какая разница, что делает ася?
Если при этом мои треды могут заниматься всем, чем захотят?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 20:10  [ТС]
eva2326,
Цитата Сообщение от eva2326 Посмотреть сообщение
Потому что вы пытаетесь сделать это на голых сокетах-беркли.
Я что-то не так делаю?) И насчет всего этого есть какой-то источник информации на данную тему который помог бы мне окончательно работабраться что к чему?
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
25.03.2019, 20:17
Цитата Сообщение от ReYalp Посмотреть сообщение
каким образом сделать чтобы не создавать много потоков?
Весь флуд в теме не читал, но замечу, что для этого необходимо использовать асинхронный ввод-вывод. Далее создаем пул потоков и в них обслуживаем соединения. В принципе, все есть в boost::asio.
Как работает асинхронное API? На самом деле это аппаратная технология, ты выделяешь память под данные и просишь ОС "запиши туда N байт из какого-то устройства ввода-вывода". Далее ОС обращается к драйверу, а тот посылает соответствующую команду нужному контроллеру "записать N байт через DMA". Также вызывающий поток может "уснуть" в ожидании завершении операции, в таком случае контроллер пошлет запрос на аппаратное прерывание по окончанию записи и ОС разбудит поток. Смысл таких сложностей - это разгрузить ЦП обслуживанием оборудования. На базе этого и состоится настоящее асинхронное API без лишних потоков. Но асинхронность можно и имитировать через потоки.
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,137
25.03.2019, 20:18
ReYalp, посмотрите документацию на функцию select или виндовый вариант с WSAEventSelect. Общий смысл такой: поток должен заниматься не работой с клиентом, а выполнять отдельные запросы. Между запросами от одного клиента приходят запросы от других клиентов и поток их выполняет. Когда поток выполнил запрос, он впадает в ожидание новых запросов. Какой запрос придёт раньше, тот и выполнится. Что бы ждать запросы сразу от множества соединений и используется select.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
25.03.2019, 20:24
Цитата Сообщение от Ygg Посмотреть сообщение
Что бы ждать запросы сразу от множества соединений и используется select.
Практически нигде он сейчас не используется из-за неэффективности работы с большим количеством соединений, используют epoll/iocp, в т.ч. и boost::asio.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 20:43  [ТС]
shmkv, с чего начать учить-то этот асинхронный ввод-вывод ? Как я думаю не лучший вариант начинать сразу с boost::asio,я хочу понять как работает отдельно асинхронность и как работает тред пул,так с чего начать?
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
25.03.2019, 20:59
Цитата Сообщение от ReYalp Посмотреть сообщение
Как я думаю не лучший вариант начинать сразу с boost::asio
По мне так нормальный вариант. Может кто-то предложит что-то более простое.
Цитата Сообщение от ReYalp Посмотреть сообщение
я хочу понять как работает отдельно асинхронность и как работает тред пул,так с чего начать?
Можно написать свой велосипед на том же iocp, но это будет на порядок сложнее, чем использовать готовое.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 21:25  [ТС]
shmkv, вот допустим нашел статью о асинхронности
Кликните здесь для просмотра всего текста

,в ней описаны насколько я понял два ее варианта (сопрограммы и callback-функции),это так или нет?
Цитата Сообщение от shmkv Посмотреть сообщение
По мне так нормальный вариант. Может кто-то предложит что-то более простое.
Просто как по мне то использовать готовое это не очень хорошо,т.к. ты просто не будешь понимать что делает твой код,да будет все работать и на подсознательном уровне ты будешь понимать что чтобы то работало нужно тут вставить это,а как оно все работает фиг его знает

Добавлено через 2 минуты
shmkv, а вот пару таких статей очень даже помогли бы в понимании всего процесса

Добавлено через 12 минут
eva2326, вот прочитал я про асинхронность одну и вторую,сколько я понял та которую мне Вы описывали это многопоточная,верно? А та которая есть в статье выше
Цитата Сообщение от ReYalp Посмотреть сообщение
вот допустим нашел статью о асинхронности
Кликните здесь для просмотра всего текста
https://tproger.ru/articles/as... ogramming/
это однопоточная асинхронность?
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
25.03.2019, 21:34
ReYalp, если хочется хардкора, то гугли про iocp: примеров и статей хватает.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 21:43  [ТС]
shmkv, мне кажется Вы не поняли что я хочу, я не хочу пока что учить как все устроено на низком уровне, мне просто достаточно будет пару примеров с обычными методами, к примеру как это описано в статье

Добавлено через 1 минуту
shmkv, просто если Вы имели дело с асинхронностью то Вы просто могли бы ответить на пару моих вопросов связанных с ней и всё
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
25.03.2019, 21:49
Цитата Сообщение от ReYalp Посмотреть сообщение
shmkv, просто если Вы имели дело с асинхронностью то Вы просто могли бы ответить на пару моих вопросов связанных с ней и всё
Могу, но конкретных вопросов не увидел
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.03.2019, 21:59  [ТС]
shmkv, так вот, как я и спрашивал выше о той статье, автор описывает два вида асинхронностей, но у него нету даже пула ьредов и прочего того что было в примере от eva2326 который был выше, она в своём примере создаёт пул тредов, а значит это уже многопоточность, верно? А автор статьи не создаёт Ани пкл тредов, Ани отдельного потока, значит это однопоточность, я правильно понимаю? Это два примера однопоточной и многопоточный асинхронности?

Добавлено через 4 минуты
shmkv, конкретный вопрос был выше, там где я ссылку на статью добавил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2019, 21:59

Асинхронность?
Уже как то создавал подобную тему, но моя текущая реализация меня не устраивает чуть более чем полностью, создам новую. Есть у меня некая...

Асинхронность
Всем привет) Я новичек в ноде, разрабатываю веб сервер. this.tokens.get(token, function(msg, that) { if (msg) { ...

Асинхронность в js
почему в консоле не находит переменную obj, но когда убираю setTimout, только тогда находит async function regUser() { ...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Асинхронность и цикл
Здравствуйте! Не могу понять как правильно сделать перебор всех страниц сайта и у каждой странице сделать свою выборку?Чет я...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит реквизиты: -. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru