Ну каг бе так: какие выводы можно сделать из этой статьи, кроме того, что она написана технической точки зрения… ээ… с сомнительной граммотностью? Какую пользу эта статья принесет?
>>Волокна это легковесные объекты которые могли бы выполнять код, переключение между ними не ресурсоемко. Контроль кол-ва системных потоков
При чем тут системные потоки, если вы рассуждаете о fibers? Такому одаренному дауну, как я, например, очень сложно это понять.
>> логические потоки
Так логический поток — это не поток на самом деле, а абстракция цепочки вызовов между контекстами или AppDomain'ами. Это COMовская приблуда, связанная с COMAppartments, при чем здесь потоки ОС?
Как только вы покажете, где в статье упомянут Эрланг, мы продолжим дискуссию более предметно.
И еще — в windows (а .net работает преимущественно в windows), есть своя абстракция, называемая fibers. Это не совсем зеленые потоки, хотя и очень похожи.
Автору стоило хотя бы ознакомиться с терминологией той области, о которой он рассуждает, чтобы не придумывать на ходу термины, вызывающие коллизии.
Статья поднимает важную тему, но является скорее констатацией, чем исследованием.
Программируя многопоточные приложения в течение нескольких лет, пришёл к полностью асинхронной модели взаимодействия потоков. Всё это позволило мне отказаться от (явного) использования объектов синхронизации.
Как ни странно, выросла не только стабильность работы, но и простота отладки. В конечном итоге, оказалось что асинхронный подход сильно снижает затраты на разработку многопоточных приложений, уже хотя бы потому что исчезает огромное количество проблем и потенциальных неприятностей вроде deadlock.
Всё это дело было реализовано в рамках одного их кроссплатфороменных фреймворков на С++. Тесты показали очевидную вещь: за всё приходится платить, и иногда данный подход себя оправдывает. О чём конкретно речь? Асинхронная модель предполагает наличие у каждого потока очереди сообщений (в моём случае я вместо сообщений храню указатели на функции и их аргументы). Очевидно, это приводит к увеличению использования оперативной памяти и работы процессора по переносу (копированию) вышеозначенных элементов очереди.
Таким образом, асинхронный подход с очередью сообщений актуален для применений, где этих сообщений не так много (не больше нескольких десятков тысяч в секунду). Это актуально для большинства прикладных программ (увы, всякие серьёзные вещи вроде серверов зачастую требуют большее быстродействие). Если условие выполняется, то есть хороший шанс написать программу, избавив себя от большинства проблем с многопоточностью.
Как пример, приведу свою прошлую программу, где шесть потоков почти не потребовали отладки при синхронизации, из-за использования асинхронного подхода и очередей.
Посмотрите на то что это за зверь Thread в .NET а также почему его ID не гарантирован соответствовать системному идентификатору потока. В общем в .NET потоки считаются логическими.
Насколько я знаю fibers (их вы называете логическими потоками?) используются при кооперативной многозадачности, когда «поток» сам отдает управление. У Thread таких свойств, вроде, нет.
Логический поток — это сущность Thread в .NET, не факт что эта сущность соответствует реальному системному потоку, т.е. реальная имплементация может быть любой (возможна на основе fibers).
Ага, сейчас переписываю систему на IObservable/IObserver. Код становиться более понятном, а параллельное программирование органично вписывается, а не воспринимается как костыли. Правда, может, это пока эйфория от использования новой техники, а затем пойдет мат:)
Вот он! Чак Норис! Он может управлять потоками взглядом :)))
PS: Вы на самом деле меня насмешили. Проблема не в том чтобы решить «проблемы» асинхронного програмирования, а в том что на них приходиться тратить время… а время — драгоценно!
Асинхронная модель программирования (часть 1)