Почему ucontext был добавлен в POSIX, а затем удален из него?

Насколько я знаю, ucontext предлагает нечто лучшее, чем setjmp. Но он устарел и теперь удален из спецификации POSIX. Так почему же он появился и почему его убрали?


person eonil    schedule 22.02.2013    source источник


Ответы (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
comment
Обоснование в связанном описании makecontext() из стандарта POSIX 2004 объясняет, почему код был проблематичным. В нем также в общих чертах описываются альтернативы — использование потоков. И это указывает на то, что очень немногие программы использовали это средство. - person Jonathan Leffler; 26.12.2013
comment
@JonathanLeffler Я нашел обоснование на POSIX 2004 Page 743. Причина, по которой он дает, в основном такая же, как я сказал, и дает более подробное объяснение. Добавление его ссылки здесь, чтобы OP мог проверить. - person Yu Hao; 26.12.2013
comment
@JonathanLeffler Из книги Сегодня очень мало приложений, использующих подпрограммы *context(). Те, кто их использует, почти всегда используют их для реализации сопрограмм.. Может быть, это уже не так. Люди изо всех сил пытаются вернуть облегченные сопрограммы в системное программирование (например, Go, Rust). И, к сожалению, я не смог найти доказательств того, что потоки POSIX могут предоставлять облегченные сопрограммы… - person eonil; 26.12.2013
comment
Интерфейс считается устаревшим уже почти десять лет. Люди, которые решили использовать его в течение этого десятилетия, не очень разумны (потому что он помечен как устаревший, поэтому со временем он исчезнет). Что касается альтернатив, я не могу предложить свое мнение. Я просто повторил то, что сказано в обосновании POSIX. Также было отмечено, что средства, использующие потоки, не были простыми. Но у них также остался интерфейс, который нельзя было реализовать в C99, поэтому они решили пометить его как устаревший. Мой комментарий должен был дополнить ответ; правая ссылка с информацией в дальнем ее конце. - person Jonathan Leffler; 26.12.2013
comment
Если кто-то хочет использовать ucontext, наиболее вероятной причиной является то, что он не хочет использовать потоки для конкретного приложения в первую очередь. Например, иметь поток для каждого клиентского соединения, которых может быть 1000. Любой, кто говорит, что нужно просто использовать потоки, просто невежественен. - person Hugo Maxwell; 03.10.2016
comment
@HugoMaxwell Бинго. Контексты позволяют планировать в пользовательском режиме. Они также допускают настоящие сопрограммы в C, что может быть очень полезно с некоторыми API. - person Demi; 22.08.2018