Насколько я знаю, ucontext
предлагает нечто лучшее, чем setjmp
. Но он устарел и теперь удален из спецификации POSIX. Так почему же он появился и почему его убрали?
Почему ucontext был добавлен в POSIX, а затем удален из него?
Ответы (1)
Подпись makecontext
от ucontext.h
:
void makecontext(ucontext_t *ucp, void (*func)(),
int argc, ...);
Обратите внимание, что func
использует пустую скобку в качестве аргумента, но это устаревшая функция в стандартном C:
C11 (ISO/IEC 9899:201x) §6.11.6 Деклараторы функций
Использование деклараторов функций с пустыми скобками (не деклараторов типов параметров в формате прототипа) является устаревшей функцией.
Это причина, по которой он устарел (и как-то неудачно).
person
Yu Hao
schedule
26.12.2013
Обоснование в связанном описании
makecontext()
из стандарта POSIX 2004 объясняет, почему код был проблематичным. В нем также в общих чертах описываются альтернативы — использование потоков. И это указывает на то, что очень немногие программы использовали это средство.
- person Jonathan Leffler; 26.12.2013
@JonathanLeffler Я нашел обоснование на POSIX 2004 Page 743. Причина, по которой он дает, в основном такая же, как я сказал, и дает более подробное объяснение. Добавление его ссылки здесь, чтобы OP мог проверить.
- person Yu Hao; 26.12.2013
@JonathanLeffler Из книги Сегодня очень мало приложений, использующих подпрограммы *context(). Те, кто их использует, почти всегда используют их для реализации сопрограмм.. Может быть, это уже не так. Люди изо всех сил пытаются вернуть облегченные сопрограммы в системное программирование (например, Go, Rust). И, к сожалению, я не смог найти доказательств того, что потоки POSIX могут предоставлять облегченные сопрограммы…
- person eonil; 26.12.2013
Интерфейс считается устаревшим уже почти десять лет. Люди, которые решили использовать его в течение этого десятилетия, не очень разумны (потому что он помечен как устаревший, поэтому со временем он исчезнет). Что касается альтернатив, я не могу предложить свое мнение. Я просто повторил то, что сказано в обосновании POSIX. Также было отмечено, что средства, использующие потоки, не были простыми. Но у них также остался интерфейс, который нельзя было реализовать в C99, поэтому они решили пометить его как устаревший. Мой комментарий должен был дополнить ответ; правая ссылка с информацией в дальнем ее конце.
- person Jonathan Leffler; 26.12.2013
Если кто-то хочет использовать ucontext, наиболее вероятной причиной является то, что он не хочет использовать потоки для конкретного приложения в первую очередь. Например, иметь поток для каждого клиентского соединения, которых может быть 1000. Любой, кто говорит, что нужно просто использовать потоки, просто невежественен.
- person Hugo Maxwell; 03.10.2016
@HugoMaxwell Бинго. Контексты позволяют планировать в пользовательском режиме. Они также допускают настоящие сопрограммы в C, что может быть очень полезно с некоторыми API.
- person Demi; 22.08.2018