Size: a a a

2021 February 25

O

Ofee in pro.cxx
Alex
Но это же многопоточный сценарий! Просто второй поток вы не порождали явно, но очевидно, что он есть.
У нас почти всегда есть операционная система, запускающая приложение. Значит ли это, что любой код (в рамках таких систем) исключительно многопоточен? Нет, я так не думаю
источник

DK

Dmitry Khominich in pro.cxx
Если программа должна выполнять много задач одновременно (например обрабатывать множество сетевых запросов), то под каждую задачу использовать системный поток плохо: не масштабируется на > 10k. Поэтому многозадачность реализуют в юзерспейсе, использую 1 или несколько системных потоков, переключая задачи вручную. Стоит задача сохранять стейт задач для suspend/resume. Это то, для чего используют корутины (stackfull как в golang или stakless как c++).
источник

A

Alex in pro.cxx
Ofee
У нас почти всегда есть операционная система, запускающая приложение. Значит ли это, что любой код (в рамках таких систем) исключительно многопоточен? Нет, я так не думаю
любой код, для работы которого нужно больше одного потока? Который юзает асинхронные операции? Да
источник

A

Alex in pro.cxx
асинхронное не может быть однопоточным
источник

DK

Dmitry Khominich in pro.cxx
Alex
асинхронное не может быть однопоточным
вы путаете асинхронность и параллелизм
источник

O

Ofee in pro.cxx
Alex
любой код, для работы которого нужно больше одного потока? Который юзает асинхронные операции? Да
Хорошо, код может быть и честно однопоточным, даже без всяких ОС под ним — блокирующе записать данные во внешнее устройство — асинхронно дождаться данных от него. Будете утверждать, что внешнее устройство выступает в роли второго потока?
источник

A

Alex in pro.cxx
Ну в примере выше рассматривается работа кода с двумя потоками, один юзерский и один системный - невидимый сам по себе, но с видимыми многопоточными эффектами
источник

AE

Alexander E. in pro.cxx
Ofee
Не нужно множества вложенных лямбд-коллбеков, это ужасно вредит читаемости кода
кейз странный, честно говоря. Ну то есть его еще надо написать..
источник

DK

Dmitry Khominich in pro.cxx
асинхронное - свойство программы, когда порядок выполнения ее подзадач не определен. Параллелизм - свойство среды выполнения, когда две и более задачи могут выполнять одновременно на разных ЦПУ.
источник

A

Alex in pro.cxx
Ofee
Хорошо, код может быть и честно однопоточным, даже без всяких ОС под ним — блокирующе записать данные во внешнее устройство — асинхронно дождаться данных от него. Будете утверждать, что внешнее устройство выступает в роли второго потока?
как асинхронно дождаться в одном потоке?
источник

AE

Alexander E. in pro.cxx
Dmitry Khominich
Если программа должна выполнять много задач одновременно (например обрабатывать множество сетевых запросов), то под каждую задачу использовать системный поток плохо: не масштабируется на > 10k. Поэтому многозадачность реализуют в юзерспейсе, использую 1 или несколько системных потоков, переключая задачи вручную. Стоит задача сохранять стейт задач для suspend/resume. Это то, для чего используют корутины (stackfull как в golang или stakless как c++).
стейт сохраняет процессор, TLS, static - переменные. Я так понял, что предлагается болеел высокоуровневый подход..
источник

A

Alex in pro.cxx
асинхронно и дождаться - вообще странно звучат вместе)
источник

S

Stolyarchuk in pro.cxx
Alex
асинхронно и дождаться - вообще странно звучат вместе)
Ну результат асинхронной операции иногда надо ждать. Неважно где)
источник

DK

Dmitry Khominich in pro.cxx
Alexander E.
стейт сохраняет процессор, TLS, static - переменные. Я так понял, что предлагается болеел высокоуровневый подход..
как стейт системных потоков сохраняет операционная система (запоминя стек и регистры), так и корутина при suspend запоминает стейт (на каком шаге внутренней стейт машины остановилась, значения локальных переменных в корутин фрейме).
источник

A

Alex in pro.cxx
Stolyarchuk
Ну результат асинхронной операции иногда надо ждать. Неважно где)
Да, согласен, вы правы. Но вопрос "как сделать что-то асинхронно без участия ещё одного потока" у меня остаётся, я не вижу таких способов.
источник

O

Ofee in pro.cxx
Alexander E.
кейз странный, честно говоря. Ну то есть его еще надо написать..
Вот небольшой псевдокод:
constexpr int max_attempts = 3;
for (int i = 0; i != max_attempts; ++i)
   if ((co_await send_large_post_request()).is_ok()) break;
Можно ли его записать понятнее и лаконичные с коллбеками, на замену которых C++20 корутины и придут в первую очередь в асинхронном коде, например?
источник

DK

Dmitry Khominich in pro.cxx
Alex
Да, согласен, вы правы. Но вопрос "как сделать что-то асинхронно без участия ещё одного потока" у меня остаётся, я не вижу таких способов.
Задачи, которые в качестве блокирующих операций только спят co_awat sleep_for(100ms); могут жить в одном потоке вместе с шедулером (который знает когда разбудить ближайшую коротину для продолжения). Получаем однопоточный асинхронный код.
источник

SK

Stas Koynov in pro.cxx
Alex
Да, согласен, вы правы. Но вопрос "как сделать что-то асинхронно без участия ещё одного потока" у меня остаётся, я не вижу таких способов.
асинхронно вы делаете сами. как в эмбедете. чутка поделали TCP, чутка UART если есть данные с АЦП обработали. вернулись в начало. и в каждой штуке скажем с UART-ом у вас внутри где-то есть свой стэйт мол щас читаем, потом проверяем, обрабаываем, отвечаем.
вот коорутина как бы будет этот стэйт сохранять сама. вы просто мол co_return.. но ради этого стоило их пилить? хз наверное есть более правильное применение
источник

O

Ofee in pro.cxx
Alex
как асинхронно дождаться в одном потоке?
Например, в блокирующем ивент лупе проверять наличие доступных данных?
источник

A

Alex in pro.cxx
Dmitry Khominich
Задачи, которые в качестве блокирующих операций только спят co_awat sleep_for(100ms); могут жить в одном потоке вместе с шедулером (который знает когда разбудить ближайшую коротину для продолжения). Получаем однопоточный асинхронный код.
Это интересно. Типа, проснуться, чекнуть статус, если ещё не готово - опять заснуть?
источник