Цитата(AlexandrY @ Jul 15 2013, 23:40)

Сейчас посмотрел Windows Task Manager увидел там 1540 потоков!
Мне с RTOS за этим никогда не угнаться.

Из частного не следует общего. Большая часть потоков порождена парочкой безумных программ, остальные однопоточные или имеют весьма ограниченное число потоков. Даже службы windows попытались компактно разместить в рамках одного svchosts.exe, а не размазывать по безумному числу процессов или потоков.
Цитата
Но даже там были скажем компоненты стека TCP/IP которые для каждого соединения создавали свой поток. Сделать случайно 1000 потоков там было как раз плюнуть.
Это специфика конкретных библиотек. Вообще для работы с TCP/IP не нужно over9000 потоков, более того, крайне вредно для массового обслуживания: google://C2K problem.
"Тяжёлые" сервера, например, могут создавать множество потоков, но уже не fork под каждое соединение (самое простое и плохое решение), а для последовательной обработки запросов одним потоком из пула свободных. А совсем тяжёлые обходятся одним потоком (процессом) и таки event driven моделью программирования.
Цитата
Так называемая "событийная" модель встречается в известной либе uC/GUI.
Она встречается в любом GUI, кроме самых примитивных может быть. Она встроена в windows, она в X-window тоже (и там вся графика отрабатывается одним потоком, одним процессом). Без событийной модели (сигналы-слоты -- по сути тоже событийная модель) я не представляю как вообще GUI построить. Из GUI toolkits без событий мне вспоминаются только поделки для текстового режима 90-х годов. Но там все окна, элементы -- модальные. Невелика хитрость.
Ещё важный момент событийно-ориентированного программирования -- отсутствие жёсткой связности компонентов на момент компиляции. Компоненты A и B могут работать вместе, но они не знают друг о друге. Т.е., например, функция A() не может напрямую вызвать функцию B(), и наоборот. Это принципиальное свойство и сколько-нибудь большие программы без него сложно построить (иначе невозможно изолировать модули, каждый должен знать о каждом). В примитивной форме такая (не)связность может обеспечиваться callback функциями и установкой в процессе исполнения (не компиляции).
Цитата
В результате эта библиотека в микроконтроллере пожирает большую часть процессорного времени. Уровень вложенности рекурсивных вызовов достигает многих десятков, стека не напасешься.
А это говорит, что там нет очереди событий или чего-то в этом роде. А очередь событий здесь -- принципиальна необходима. Или какой-то механизм её замещающий. И тогда ни рекурсий, ни вложенности. Обработка строго последовательная. См. state-machine.com. Но мне у них что не нравится: все задают этот вопрос, а что если очередь переполнится. Такой же механизм, кстати, описан в wikipedia в статье "Embedded system", он же описывается в книгах (обработчики прерываний кладут адреса функций в очередь). Я думаю, ответ здесь должен быть такой, что некоторые события должны обрабатываться непосредственно, без очереди.
Цитата
Честно говоря хотя библиотеки С-и и могут быть настроены под RTOS (и их бинарный вид не проблема для этого)
Как это не проблема, я же явно указал на принципиальную невозможность использования _переменной_ errno. А после компиляции в бинарный вид оно уже заняло место в конкретных машинных кодах и тут ничего не изменить. Библиотеки расчитывающие на многопоточность (не многозадачность, т.к. к многозадачности с полной изоляцией процессов, а-ля unix, готова любая C-библиотека) изначально имеют что-то вроде #define errno (TLS->errno) и/или даже #define errno (*errno_location()), где функция errno_location() возвращает действительный адрес errno для данного потока.
Если библиотека не предполагает вытеснение -- здесь ничего не сделать. Только использовать её в кооперативной ОС. В таком случае тоже... есть проблемы с рядом функций вроде strtok(), но таких функций действительно по пальцам пересчитать и можно их переписать самому.
А malloc()? Тут очевидно. Не reentrant и не thread-safe.
А printf? Невозможен одновременный доступ к структуре FILE. А ведь на PC из разных потоков всё работает... Не reentrant и не thread-safe.
И самое главное -- для ускорения вычислений некоторые, особенно математические, функции могут использовать статические переменные. Не reentrant и не thread-safe.
Цитата
но я предпочитаю просто не использовать небезопасных для многозадачности функций.
Не надо путать thread-safe и reentrant-safe функции. Это разные понятия, хотя и похожие. Функции для вытесняющей многозадачности должны быть thread-safe.
Цитата
Этих функций на C-и по пальцам можно пересчитать.
Это "безопасные" можно по пальцам сосчитать.
И вы туда же: "мы не используем функций C-библиотеки". Вы сами не знаете чего не используете. Потому, что одни функции могут вызываться из других или из функций сторонних библиотек. И вы не знаете какие проблемы связывают C-библиотеку и многозадачность -- вот я о чём. А всё туда же. Не имею ничего против многозадачности, но она возможна только в рамках соответствующей библиотеки и ОС. Я пример привёл: и eCOS и newlib, например, подразумевают многопотчность. А библиотека фирмы dinkumware -- нет, и здесь возможна, максимум, кооперативная ОС, или вообще не возможна. Или можно "не использовать библиотечных функций", но это очень порочный путь.