Совместимы ли функции makecontext () / swapcontext () с C ++? - PullRequest
9 голосов
/ 14 февраля 2012

В средах Unix семейство функций makecontext()/swapcontext() иногда используется для реализации сопрограмм в C. Однако эти функции напрямую управляют стеком и потоком выполнения. Часто, когда эти функциональные возможности низкого уровня сильно отличаются при переключении с C на C ++.

Таким образом, вопрос в том, возникнут ли какие-либо проблемы с реализацией сопрограмм с использованием makecontext() и swapcontext(). Конечно, очевидно, что нужно было бы позаботиться о том, чтобы исключение не могло избежать такой сопрограммы, поскольку в стеке не было бы обработчика исключений для этого, и программа, скорее всего, была бы segfault. Но кроме этого есть ли какая-либо несовместимость между тем, как C ++ обрабатывает вещи внутренне, и makecontext() и setcontext() изменяют путь выполнения?

1 Ответ

6 голосов
/ 26 февраля 2012

Я использовал makecontext() / swapcontext() с кодом C ++, и, как вы говорите, главное, на что нужно обратить внимание, это исключения.Помимо этого у меня не было никаких проблем.Несмотря на устаревание в соответствии со стандартом, они все еще хорошо поддерживаются Unix-подобными операционными системами.(есть предостережение для Mac OS X: вам нужно #define _XOPEN_SOURCE перед #including соответствующими заголовками.) Обоснование для того, чтобы сделать их устаревшими, тоже довольно хромое - они могли бы заменить их версией, подобной pthreads, гдеуказатель на функцию принимает один аргумент void *.

Как вы говорите, потоки не являются полезной заменой, поэтому я бы пошел дальше и использовал swapcontext().Вы также можете найти эту запись в блоге интересной для создания собственной версии функций.

...