Подумалось внезапно - а в какой момент и почему так получилось, что практически все современные языки пришли к промисам и сабжу для записи параллельного кода? До этого момента какие только извращения не бытовали: конечные автоматы, файберы, green threads (включая чудо нанотехнологий поверх duff device под названием protothreads), просто ад
(
Read more... )
Comments 23
Параллельный код - это либо fork, либо pthreads вручную, либо pthreads "автоматом" - openmp.
Неужто появились какие-то новомодные способы? У меня коллега - плюсовик, пишет исключительно на самой последней ревизии крестов (говорит, там много чего "вкусного"). Но тоже параллельный код делает аналогично. Ну, или через обертки вроде ASIO. Но у тех тоже "под капотом" pthreads (а иногда даже блокирующая псевдопараллельность через поллинг).
UPD: погуглил. Оказывается, это про жабоскрипт. Премерзский язычонок. Очень хреново, что в веб-мордах без него никуда. Хуже жабоскрипта может быть разве что пытхон какой-нибудь или вантузоидный до-диез (но там вообще маразм высшей стадии).
Reply
Смысл в замене конечно-автоматной похабщины кодом в обычном линейном стиле: "if this do_that(); and_do_that(); and_then_do_another_thing();".
Reply
> Смысл в замене конечно-автоматной похабщины
А вот знакомый-крестовик, наоборот, конечные автоматы использовать стал, т.к. это охрененно удобно! Правда, не в сишном стиле (switch/case), а в виде методов класса или как-то так (после красивого страуструповского С++ современные кресты я вообще не воспринимаю).
Там еще всякую дичь можно делать вроде run().first().second().third()... В принципе, я и в сях так могу заморочиться со структурами с указателями на функции, но нафиг оно мне нужно, когда есть более красивые варианты?
А уж для микроконтроллеров конечные автоматы - вообще прелесть! У меня бывают всякие вложенные по нескольку уровней. Да и в последнем велосипеде для управления спектрографом у меня все на автоматах.
Reply
Любишь, поди, в дебаггере сидеть? :) Переписать это хотя бы на green threads, сразу жизнь в несколько раз проще станет.
Reply
Reply
switch(state) {
case 0: do_this(); nextstate = 1; break;
case 1: do_that(); nextstate = 2; break;
....
}
return nextstate;
никакие дополнительные возможности не нужны, наоборот, поверх этого можно реализовать всё что угодно. Только неудобно.
Reply
Reply
Reply
Reply
Reply
Reply
И да - отлично понимаю, как может async/await помочь в случае, если надо послать по сети запрос, а дождаться получения и вернуть результат в основной поток. Шутка юмора в том, что используя действительно асинхронные интерфейсы можно добиться значительно более высокой производительности, не потеряв в удобстве кода.
Ещё раз повторю мысль из предыдущего поста. Многопоточное программирование - оно про доступ к данным из разных потоков. async/await никак эту проблемму не решает. В случае если же данные для каждой задачи полностью независимы, то многопоточное программирование крайне простое при любом варианте интерфейса.
Reply
Многопоточные проблемы имеют к этому весьма косвенное отношение.
Reply
Почему параллельного-то? Асинхронного, да, но часто однопоточного.
Reply
Reply
Leave a comment