LINUX.ORG.RU

Вопрос по makecontext(), swapcontext()

 , fibers


0

2

Кто-нибудь пользовался функциями makecontext(), swapcontext()? Безопасно ли ими пользоваться, если пишешь программу на с++?

★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Нужны сопрограммы? Используй корутины из c++20. Не надо всякое сишное говнецо пропихивать.

ox55ff ★★★★★
()

makecontext(), swapcontext()

Не используй их — очень медленно (и deprecated, кстати). Лучше возьми libcoro, если охота повелосипедить сверху самому. Также имеются boost::coroutine и boost::fiber.

Безопасно ли ими пользоваться, если пишешь программу на с++?

Есть несколько подводных камней:

  1. reentrancy — когда переключение файберов происходит из callback-а, который вызывает библиотечная функция, но мне сходу не приходит на ум, что в libstdc++ может использовать глобальный state.
  2. unhandled exception — но это в любом случае ничего хорошего не предвещает. Тут только разница в том, какое сообщение будет напечатано при аварийном завершении приложения
  3. std::current_exception должен использовать thread local variables, так что стоит много раз подумать, прежде чем преключать файберы во время обработки исключения

А вообще файберы в C++ используют давно и довольно успешно, например https://github.com/mozy/mordor

kawaii_neko ★★★★
()
Ответ на: комментарий от ox55ff

Используй корутины из c++20

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

А по факту получили stackless с геморроем, о котором https://www.scs.stanford.edu/~dm/blog/c -coroutines.html пишут «[co_await] ensures all local variables in the current function—which must be a coroutine—are saved to a heap-allocated object».

kawaii_neko ★★★★
()
Ответ на: комментарий от kawaii_neko

Зато работает на множестве платформ, а не только на x86. На хабре была статейка, где цпп корутины на микроконтроллере в baremetal используются.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Зато работает на множестве платформ, а не только на x86

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

kawaii_neko ★★★★
()
Ответ на: комментарий от ox55ff

Нужны сопрограммы? Используй корутины из c++20. Не надо всякое сишное говнецо пропихивать.

Кто знает, на эльбрусе это заработало? Там раньше буст был целиком, кроме boost context, который не осилили.

anonymous
()
Ответ на: комментарий от anonymous

Не слышал, чтобы на эльбрусе был с++20. У них фронтэнд покупной. Не знаю какая версия используется. Но на сайте ихнего фронтенда Edison Design Group есть ссылка на список поддерживаемых фич c++20 и там есть корутины. Может скоро и на эльбрус завезут.

ox55ff ★★★★★
()

пользовался, разрешаю

но есть минусы:

  1. тормозит. если нужна поддержка 1-2-3 платформ, то проще навелосипедить на ассемблере

  2. задепрекейчено ещё в прошлом веке, так что когда-нибудь можно будет сильно удивиться обновляя libc

anonymous
()
Ответ на: комментарий от ox55ff

там можно выцепить отдельные либы или можно слинковать статически. ничего осбо жирного нет.

почитай у Оливера про то, в чем разница между тем, что сейчас в стандарте и тем, что у него http://boost.org/libs/coroutine2 (там в интро это кажется).

zerhud
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.