Size: a a a

2020 October 19

ПК

Побитый Кирпич... in pro.cxx
Stas Koynov
Если по делу, не используйте их в проде, тем более на эмбедете. просто напишите конечный автомат и все. он прост, все логично, можно даже студента заставить его поддерживать. Конечно сейчас придут люди мол Коорутины, все их ждали, что вы такое говорите...
Дак корутины итак разворачиваются в конечный автомат. Ты просто предлагаешь писать его постоянно вручную вместо того чтоб использовать кодген компилятора. И какой в этом смысл?
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
Переслано от Артём Колпаков
Товарищи, помогите прояснить некоторые моменты.
1) http://eel.is/c++draft/basic.life#6 говорит ... after the lifetime has ended and before the storage reused or released..., однако Example 1 на B::mutate как мне кажется неуместен, так как прямо в нем имеется комментарий, что storage reused. Получается здесь UB, так как попытка взаимодействия с "мёртвым" объектом? Или же подразумевается, что указатель, на основе которого формируется this не был "переназначен" после lifetime end?
2) Было бы здесь уместно применить
std::launder(this)->f();
? Или std::launder с каким-то кастом?
3)  Даёт ли стандарт определения словам reused, released?
4) ISO/IEC 9899:202x(С2х) 6.2.4 говорит, что The value of a pointer becomes indeterminate when the object it points to (or just past) reaches the
end of its lifetime. Выполняется ли это в С++? Или лишь это http://eel.is/c++draft/basic.memobj#basic.stc.general-4?
5) В свете последней ссылки, с чем связаны указатели: с объектом или хранилищем?
6) http://eel.is/c++draft/basic.life#8 transparently replaceable работает лишь для immediate after замены о1 на о2. или же это свойство может проходить через серию замен, к примеру https://godbolt.org/z/1zcTjh
1) весь тот пример про то, как объект по указателю pb/this, прекращает свое существование, а storage остается и указатели на него остаются действительными. да, UB там тогда, когда при помощи этого указателя делается что-то, для чего требуется существование объекта. никакого переназначения не надо

2) нет, std::launder никак не поможет, потому что объекта нет. но на горизонте маячит еще одна библиотечная функция на эту тему: std::start_lifetime_as()

3) не нахожу их толкования ни в стандарте, ни в отдельном стандарте с ИТ-терминологией, что наводит на мысли, что определений в обычных толковых словарях достаточно

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

5) указатели связаны с хранилищем

6) не нахожу в формулировке этого пункта свидетельств, что каждая замена в серии должна удовлетворять условиям прозрачной замены
источник

SK

Stas Koynov in pro.cxx
Побитый Кирпич
Дак корутины итак разворачиваются в конечный автомат. Ты просто предлагаешь писать его постоянно вручную вместо того чтоб использовать кодген компилятора. И какой в этом смысл?
тем что простой КА проще!. вот скажем весь оверхед у меня это:
void modbus_rtu_server(void)
{
   server_SM_table[server.state](&server);
}

+ таблица функций. каждая функция полезная нагрузка для данного состояния все.
Например прерывание по УАРТУ вы просто перещелкнули стэйт в другое место.
как мне это сделать с коорутинами? ах да заводить еще один стейт. чтобы внутри коорутины проверить его очень удобно да..., потом студенту говоришь вот стейт проверки пакетов пили, что я должен ему сказать с коорутиной? вот там в это большой найди проверки между пакет есть и пакет сенд. между ними будет твой кусок кода.. коорутина же ОДИН большой автомат. Ок вы предлагаете одна коорутина для каждого состояния? и каждый раз в них заходить и если мол не наш стейт то мол yeld хмм удобно да... и главное никакого оверхеда...
Или все пилить в одной большой коорутине? чтоб она была вместо 5-7 функций по 10-20 строк одна но 200 строк удобно, прям бегу все переписывать на них...
источник

AK

Andrei K in pro.cxx
Из этого мыслепотока я кажется понял, что чувак не в курсе ассиметричных корутин.
источник

AK

Andrei K in pro.cxx
Любой конечный автомат можно выразить корутинами. С тем же оверхедом, если компилятор умеет в их оптимизацию. Всё. Это аксиома.
источник

AK

Andrei K in pro.cxx
Компиляторные стеклесс/стейтлес корутины ничего не убавляют от перформанса, но добавляют к выразительности и простоте написания кода. </thread>
источник

ПК

Побитый Кирпич... in pro.cxx
Stas Koynov
тем что простой КА проще!. вот скажем весь оверхед у меня это:
void modbus_rtu_server(void)
{
   server_SM_table[server.state](&server);
}

+ таблица функций. каждая функция полезная нагрузка для данного состояния все.
Например прерывание по УАРТУ вы просто перещелкнули стэйт в другое место.
как мне это сделать с коорутинами? ах да заводить еще один стейт. чтобы внутри коорутины проверить его очень удобно да..., потом студенту говоришь вот стейт проверки пакетов пили, что я должен ему сказать с коорутиной? вот там в это большой найди проверки между пакет есть и пакет сенд. между ними будет твой кусок кода.. коорутина же ОДИН большой автомат. Ок вы предлагаете одна коорутина для каждого состояния? и каждый раз в них заходить и если мол не наш стейт то мол yeld хмм удобно да... и главное никакого оверхеда...
Или все пилить в одной большой коорутине? чтоб она была вместо 5-7 функций по 10-20 строк одна но 200 строк удобно, прям бегу все переписывать на них...
Обычно код для инфраструктуры корутин пишут один раз, туда не надо заглядывать. А если ты про код самих корутин, то там нет практически никаких сложностей с пониманием, он выглядит как синхронный
источник

SK

Stas Koynov in pro.cxx
Наверное у вас что не студент, то выпускник Яндекса ну круто че... Моему показал таблицу и оверехед в одну строку. а вам, ну вашим то че обьеснять, они уже на шаблонах пишут с первого класса.
источник

ПК

Побитый Кирпич... in pro.cxx
Stas Koynov
Наверное у вас что не студент, то выпускник Яндекса ну круто че... Моему показал таблицу и оверехед в одну строку. а вам, ну вашим то че обьеснять, они уже на шаблонах пишут с первого класса.
Просто обычно твоя цель не написать конечный автомат, а выполнить какую то задачу. И хотелось бы, чтобы кишки инструмента для ее решения не торчали наружу
источник

t

tino4ka_isaeva in pro.cxx
А причём тут Яндекс вообще, контора как контора, как и любая.
источник

SK

Stas Koynov in pro.cxx
tino4ka_isaeva
А причём тут Яндекс вообще, контора как контора, как и любая.
Априори, если ты из Яндекса то ты семи пядей во лбу!
источник

t

tino4ka_isaeva in pro.cxx
Stas Koynov
Зря, щас как меня будут чморить. Мол вы против ++ и все такое. Скажут еще что вы за JS.
Этого тоже не понял, js, язык как язык. Каждый для решения своих задач
источник

КМ

Костя Мальованик... in pro.cxx
Всем привет. У меня есть длл, с неё я получаю void* на функцию через (void*)GetProcAddress(HMODULE)instance, functionName) . Кто может подсказать  как мне получить мою функцию с void* и вызвать её ????
источник

AS

Alex Sandrov in pro.cxx
Костя Мальованик
Всем привет. У меня есть длл, с неё я получаю void* на функцию через (void*)GetProcAddress(HMODULE)instance, functionName) . Кто может подсказать  как мне получить мою функцию с void* и вызвать её ????
кастовать void* в тип функции:
HRESULT (WINAPI*__fpDwmGetWindowAttribute)(HWND, DWORD, PVOID, DWORD);

__fpDwmGetWindowAttribute = (HRESULT (WINAPI*)(HWND, DWORD, PVOID, DWORD))GetProcAddress(hModuleDWM, "DwmGetWindowAttribute");
источник

SK

Stas Koynov in pro.cxx
tino4ka_isaeva
Этого тоже не понял, js, язык как язык. Каждый для решения своих задач
Клубника ты походу не уловил иронии, ну ладно оффтоп. Коорутины форева!
источник

NV

Nik Vzdornov in pro.cxx
Alexander Malkov
давайте я проще напишу:
Есть функция, мы запустили в ней асинхронную операцию в которой есть коллбек, все функция завершилась асинхронная операция пошла работать дальше, выполнилась, выполнился коллбек, пошло все работать дальше
--
корутины:
есть функция, запустили в ней co_await после чего запустили коллбек, и вот тут проблема - останавливается выполнение всего контекста, как бы мы это делали в синхронном режиме:

void async_func() {
  std::async(std::launch::async, []() {
         some_func();
         callback();
   }
}

int main() {
   async_func();
}

Тут неблокируется функция и все норм идет дальше
А вот так
Task coro_func() {
   co_await some_func();
   callback();
}

int main() {
   coro_func();
}

пока callback не выполнится контекст дальше coro_func не выполняется, как будто мы вызвали функцию в синхронном режиме - это нормальное поведение? и как все-таки использовать это асинхронно?
Антон Полухин как-то давно писал https://m.habr.com/ru/company/yandex/blog/420861/   думаю, что и вашу задачу можно решить схожим образом, если конечно актуально.
источник

AM

Alexander Malkov in pro.cxx
Проблема в том, что мне в awaitable пришлось все равно создавать поток, чтобы корутину запускать асинхронно
источник

AM

Alexander Malkov in pro.cxx
Да, можно разные методы придумать thread pool подключаться к уже существующим потокам, но..
источник

t

tino4ka_isaeva in pro.cxx
Stas Koynov
Клубника ты походу не уловил иронии, ну ладно оффтоп. Коорутины форева!
ну, так скажи без иронии, как ты сам лично делаешь для себя, почему тебе не нравится, кроме того что кода больше, а не переиначивай всё на какие-то названия чужих маркетинговых компаний, используя вещи, которые в определённых кругах кем-то культивируются
источник

AM

Alexander Malkov in pro.cxx
Пока единственный плюс, кроме красоты кода - отсутствие динамических аллокаций от лямбд
источник