Совместимы ли функции makecontext () / swapcontext () с C ++

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

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


person LiKao    schedule 13.02.2012    source источник
comment
Я никогда не слышал об этих функциях. Знаете ли вы, что POSIX 2001 уже пометил их как устаревшие в пользу потоков ?   -  person Fred Foo    schedule 14.02.2012
comment
@larsmans: Жалко. С сопрограммами проще работать с потоками. Да, вы можете эмулировать сопрограммы с потоками, но только с накладными расходами (синхронизация!), И когда в любой момент времени выполняется только один поток, а все остальные заблокированы, это не совсем то, для чего предназначена многопоточность.   -  person celtschk    schedule 14.02.2012
comment
^^ это становится еще более сложным, когда вы хотите использовать потоки И сопрограммы (для параллелизма и параллелизма соответственно)   -  person James M. Lay    schedule 21.10.2020


Ответы (1)


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

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

person pmdj    schedule 25.02.2012
comment
Интересный пост (хотя я считаю, что лучшее использование сопрограмм, вероятно, не для точной нарезки времени или недолговечных экземпляров, поэтому приведенные накладные расходы могут быть наихудшим случаем). В любом случае, просто добавлю, что я избегаю генерирования исключений и в остальном не имею проблем с использованием make / swapcontext (и то же самое с волокнами Windows) в проект C ++. - person John McFarlane; 19.12.2012