Хорошо, только я не понял вот чего: предложенное мной решение является достаточно парагматичным на ваш взгляд или нет? В любом случае, в конечном итоге процессор у нас один, сколько бы нитей мы на нем ни запустили. Ведь все нити на самом деле выполняются по очереди, а не одновременно, так что вытесняющая многозадачность на нижнем уровне сводится к кооперативной с той только разницей, что в кооперативной многозадачности каждая задача сама решает, когда отдать процессор другим задачам, а в вытесняющей вытеснение производится принудительно в произвольный момент времени. В этом смысле вытесняющая многозадачность - это просто такой способ писать программы. Способ писать. Один из способов, а не что-то принципиально иное. Поэтому, я считаю, весь вопрос при выборе того или иного способа заключается в том, будет ли у нас в результате достаточно прозрачная структура программы, т.е. можно ли адекватно имитировать многозадачность, не вводя дополнительных сущностей. Другими словами, есть ли простой способ написать программу с аналогичными возможностями, но без концептуальной путаницы и внезапных прерываний выполнения, требующих механизмов синхронизации и т.п. Я считаю, что продемонстрировал такой способ. Вы согласны с тем, что я его продемонстрировал и что он действительно достаточно прост?

Что касается гружения процессора при обращении к порту связи, то я не понимаю, на какую чашу весов этот аргумент. Если процессор так сильно грузится, то куда бы вы ни поместили код - хоть в отдельную нить, хоть в ту же самую - нагрузка ведь не изменится, не так ли? Я при работе своей системы никакой нагрузки не наблюдаю.

Если вы пытаетесь сказать, что "засыпающая" до прихода данных нить будет потреблять меньше процессорных ресурсов, чем периодически проверяющая на пустоту буфер приема драйвера, то вы правы. Что касается исключительной дороговизны опроса буфера из вашего примера, это скорее всего недостатки ОС либо драйвера. В таком случае ваш способ может оказаться единственно работоспособным, так что вы снова правы - в контексте того конкретного примера. Я же пытаюсь рассуждать в несколько более общем плане.

Не менее прагматично, но прагматично в ином плане.

Я считаю, что вытесняющая многозадачность может быть необходима во "враждебном окружении" вроде ОС MS Windows. "Враждебность" его заключается в том, что параллельно работают много программ, написанных неизвестно кем и как. Любая из этих программ может "зависнуть" и сломаться. Естественно, мы не хотим, чтобы такой сбой привел к краху всей системы, мы хотим закрыть "плохую" программу и спокойно продолжить работу с остальными. В этом случае конкурентность дает необходимую независимость. Но внутри своей-то собственной программы неужели нельзя навести порядок, чтобы все долгоиграющие процессы были разбиты на кооперативные подзадачи и не увеличивали время реакции?