Size: a a a

Maxwell's Demons

2021 July 05

a

aum in Maxwell's Demons
"В кратце, идея сопрограмм состоит в возможности приостановки функции в любом месте исполнения с последствующим восстановлением ее работы из прерванной точки."

Как-то странно. Зачем останавливать текущий поток ради запуска задачи в другом псевдо-потоке и ожидания его выполнения?
источник

IS

Igor Spiridonov in Maxwell's Demons
ну так task так работают
источник

a

aum in Maxwell's Demons
а почему не выполнить работу тут же, в этом потоке, если он все равно будет ждать?
источник

IS

Igor Spiridonov in Maxwell's Demons
ну вот например у тебя есть циклическая функция с более высоким приоритетом. Таким, что нужно его обработать как можно раньше. И с помощью корутин ты можешь это реализовать, прерывая выполнение текущей функции. Это один из примеров. То же ты можешь сделать с помощью прерываний, или Фриртос. Это если я правильно понял. Давно хотел их пощупать, да пока квалификации не хватает. Хорошо, что Валентин выложил статью.
источник

a

aum in Maxwell's Demons
как-то не верится, что корутина может иметь приоритет выше задачи
и вопрос был по формулировке в статье
источник

VK

Valentin Kornienko in Maxwell's Demons
Прикол в том, что мы не ждём ее завершения.
источник

VK

Valentin Kornienko in Maxwell's Demons
По окончанию работы восстанавливается состояние вызова, в котором мы были
источник

IS

Igor Spiridonov in Maxwell's Demons
По факту мы таски реализуем?
источник

a

aum in Maxwell's Demons
а что мы делаем?
источник

VK

Valentin Kornienko in Maxwell's Demons
Условно, мы в основном потоке крутим функцию передачи данных и eventloop. Передача данных у нас прерывание + дма. Мы поставили запрос на передачу и приостановили корутину, в которой мы передаём данные. Ее handle перебросили в драйвер для spi. А в прерывании по окончанию передачи данных сделали .resume хендлу корутины, тем самым мы восстановились в точке, где была остановлена сопрограмма и продолжили ее выполнение
источник

VK

Valentin Kornienko in Maxwell's Demons
Или же, по окончании работы передачи данных (куска) положили coroutine habdle в eventloop и уже из основного потока восстановились
источник

VK

Valentin Kornienko in Maxwell's Demons
Идея в чем, пока мы передавали что то по DMA- мы не ждали окончания передачи данных и не занимались вопросом восстановления контекста "машины состояний" которая была в функции передачи данных
источник

a

aum in Maxwell's Demons
то есть "приостановка" относится не к месту вызова корутины, а к самой корутине?
т.е. я неправильно понял фразу?
источник

VK

Valentin Kornienko in Maxwell's Demons
Да, приостановка у корутины происходит
источник

VK

Valentin Kornienko in Maxwell's Demons
И при ее приостановке управление возвращается вызывающей стороне
источник

VK

Valentin Kornienko in Maxwell's Demons
Попробуйте поиграться с минимальными примерами в отладчике, поймёте, в чем идея😄
источник

V

Vasya in Maxwell's Demons
Если просто. В теле корутины можно написать co_await <объект> и в этом месте можно приостановить (но не обязательно) выполнение корутины. Когда нужно возобновить корутину с того же места, вызывается метод resume у хэндла корутины. Вызвать resume можно откуда угодно, даже из другого потока. В этом случае выполнение корутины продолжится в контексте другого потока.

В c++ корутины спроектированы достаточно абстрактно. Можно по разному их использовать.
источник

a

aum in Maxwell's Demons
Ага. пасибо, буду дальше читать,
только мутно как-то...
Общий-то смысл какой?
Если выполняет функцию, то чтобы передать управление другой корутине дергаем некую функцию типа switch или wait?
Т.е. типа кооперативной многозадачности? Или вытесняющая реализована?
источник

V

VadimAnimeEmbedder in Maxwell's Demons
Они жрет меньше.
источник

V

VadimAnimeEmbedder in Maxwell's Demons
По памяти и ресурсу.
источник