Добрый день, Dmitry Groshev!
Ваше сообщение от 24.02.2008 15:31:
> Лично я не вижу, каким вообще образом можно "устранить нереентерабельность", связанную с не-атомарностью всех сколь-нибудь сложных операций. Если гонки _между_ потоками ещё в принципе можно исключить совсем, пришпилив мутекс к каждой переменной (и помахав производительности платочком вслед) - то насчёт гонок _внутри_ потока это уже к господу богу, жаловаться на неправильно сотворённый мир. ;-)
>
Мутексы нужны только для неразделяемых ресурсов. А реентерабельность
реализуется легко - исключением глобальных переменных и прочих
глобальных структур. Делов то.
> Можно, конечно, поступить как в Виндах - если асинхронных сигналов не будет вообще, то не будет и проблем с ними связанных - а можно исходить из принципа, что некоторые из программистов всё же наделены мозгами и чётко обозначенные грабли способны обойти, а всех прочих никто не заставляет туда соваться.
>
Асинхронные сигналы в Виндах есть.
> Какой дистрибутив? Хочется знать, от чего держаться подальше. :-)
> Лично у меня MOPS Linux 5.1 надёжен как скала.
>
Я же написал вчера - FC8. Тоже бывало в FC с 5 по 7. Все мне говорят,
что FC для тестов и сделана, и что мол ждать там стабильности не стоит,
поэтому не поленился в прошлом году еще на отдельной машине поставить
Debian (конкретно Ubuntu). Тоже глючит временами. И это при том что я
работаю с линуксом редко - в основном по сетевым делам (мы - провайдеры,
у нас юникс в сотнях железок по всей области) и для испытания каких-то
программ в их родной среде (вместо cygwin и портов).
> Могу только пожелать счастливого пути - на Линукс никого силком не тащат. Интересоваться, где берут такую безглючную винду, не буду - для меня она уже пройденный этап.
>
Да, тоже самое я говорю про людей, попробовавших Форт, и возвращающимся
на свои прежние инструменты. Каждому своё. А я просто использую всё -
какой-то задаче лучше винда, какой-то unix; какой-то программе лучше
Forth, какой-то JavaScript, какой-то XSLT, и т.д. Как там говорится, "я
говорю по-английски с торговцами, по-итальянски с женщинами,
по-французски с мужчинами, по-испански с богом, а по-немецки с моей
лошадью"? Не пройденные этапы, а освоенные этапы.
> Плохо, когда слышали звон, но не поинтересовались где он...
>
Вот именно :)
> _Ядро_ в Линуксе, разумеется, реентерабельно. Большинство библиотек также реентерабельно - из _разных_ потоков. А реентерабельность всех функций из _того_же_ потока - бред воспалённого мозга: если некая функция блокирует некий объект и с ним работает, и в это время её прерывают и вызывают снова - то разблокирования объекта она будет ждать вечно.
>
Блокировки не имеют прямого отношения к реентерабельности. Блокировками
(доступа к глобальным данным) _пытаются_ решать задачу
реентерабельности. А можно просто минимизировать (а то и вовсе
исключить) работу с глобальными данными, тогда никаких блокировок не
понадобится.
"Реентерабельность функций из того же потока" - "бред воспаленного
мозга"? А как насчет рекурсии? ;)
Если речь об обработке прерываний, о колбэках из оси в пользовательский
код (а оттуда обратно в ось), то это нельзя однозначно считать одним
потоком (управления), т.к. там все же часто создается отдельный стек, а
это уже почти отдельный поток. В SPF по умолчанию колбэки обрабатываются
как потоки, поэтому автоматически реентерабельны.
> Всё в порядке будет - и в той, и в другой. Если, конечно, приложить к делу прямые руки.
>
Это само собой. Последний аргумент юниксоида (равно как и фортера :).
> Да, я знаю - "нормальная" винда не позволяет fork(),
Ха, был уверен, что так будет сказано :-) Очень запросто позволяет винда
fork()! Даже был такой вирус, который это использует. Я в 2002м
прикручивал к Eserv'у антивирусные API, и при испытаниях случайно
запустил живой вирус - у меня от его заражения все зараженные форты
начали форковать (вместо нормального запуска отдельного процесса) - то
есть запускаешь CreateProcess(сам_себя), а получаешь не "чистый" новый
процесс, а копию работающей сессии, включая всё что там скомпилировал в
словарь. Потому что вирус пометил все секции exe как shared. Для полной
эмуляции fork'а достаточно было сделать jmp. Я описывал это где-то в
сетях тогда (сначала подумал, что глюк какой-то удивительный :).
А о том что для винды уже больше 15 лет (столько же, сколько в Linux'е,
или даже больше, учитывая что разработка NT стартовала на пару лет
раньше) существует и обычных posix'овый fork() (в psxdll.dll) я уже и не
говорю - его даже cygwin не использует, т.к. собственные виндовые
функции лучше.
> поэтому виндузятники парятся с потоками; но зачем же выдавать нужду за добродетель? :-)
>
Ну-ну. А зачем тогда в линуксе прикрутили в конце-концов потоки - только
чтобы винду эмулировать? ;) Или просто чтобы, наконец, стать полностью
POSIX-совместимыми? Ну а зачем в posix'е тогда потоки сделали?
> Ядру Линукса нет разницы - процесс или поток: переключение одинаково дешёвое.
Одинаковое - потому, что многопоточность там эмулируют на базе
многозадачности. А если б была родная реализация многопоточности -
потоки были бы дешевле по любому.
> Поэтому я имею выбор - хочу ли я делать _всю_ память общей для всех потоков, или в данной конкретной задаче удобнее будет без этого. Можно, конечно, спорить, что иметь выбор - это плохо и неправильно... ;-)
>
Повторюсь: все, что есть в юниксе, есть и в винде, но не всегда
справедливо обратное. Да, в винде создание процесса дороже, чем в юниксе
- по той же самой причине (толще, сложнее).
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev