1. C# / Говнокод #3116

    +111

    1. 1
    2. 2
    3. 3
    4. 4
    try {} finally {
             retVal = NativeMethods.CreateProcess ( /* ... */ );
            /* ... и дальше остальной код... */
    }

    Откопано в исходниках .NET 2.0 Framework, так реализуется Process.Start. Не очень понял замысла. Нашёл, что finally обязательно продолжит исполняться, если во время его исполнения на поток ВНЕЗАПНО вызван метод Abort. Т.е. если потоку, создающему процесс, сделать аборт, процесс всё равно упорно создаcтся и запустится (чистки памяти я не нашёл). В чём смысл? Так можно было бы тогда всякий код оборачивать в finally... Ящитаю, что это всё костыли вокруг говноархитектуры. Не зря в Яве Thread.stop сделали deprecated. А вы как считаете?

    Запостил: cfdev, 27 Апреля 2010

    Комментарии (38) RSS

    • Блин, вот сейчас я очень хочу подписаться на комментарии. На емейл, не по рсс.
      А нельзя :(
      Ответить
      • делаем делаем делаем :)
        Ответить
      • а пока можно использовать http://www.rss2email.ru/
        Ответить
        • О! Спасибо.
          Ответить
        • Хм. "К сожалению, для указанного сайта рассылка невозможна. Может быть вы допустили ошибку в написании адреса?".
          С адресом http://govnokod.ru/comments/2837/rss
          Ответить
          • :(
            Ответить
            • Ждем, короче, подписку на емейл :))
              Ответить
              • Ждём долго подписку на емейл. :((
                Ответить
                • вот лучше помог бы :)
                  Ответить
                  • А тут любой может помочь. Все программисты. :)
                    Ответить
                  • вы хотите открыть исходники? )
                    Ответить
                    • а они закрыты?
                      Ответить
                    • с первого дня работы Говнокод.ру был опенсорсным :)
                      кстати, уберите, пожалуйста аватарку, похожую на аватарку гвеста, не путайте людей. спасибо
                      Ответить
                      • а где исходники? на mzz.ru?

                        там говноэффект:

                        "Ошибка
                        запрошенный виртуальный сервер не существует или перегружен"
                        Ответить
                        • ТЫ ЧТО НЕ ХОДИЛ НА СТРАНИЦУ С ОБРАТНОЙ СВЯЗЬЮ77

                          Страница проекта на google.code
                          http://code.google.com/p/govnokod/
                          Ответить
                          • Ну, во-первых, ссылка находится в самой, так сказать, жопе, а во-вторых, я бы не подумал, что найти исходники можно в "Обратной связи", обратная связь это же типа мыло автора там, все дела.
                            Ответить
                            • да, не слишком подходящее место для сорцев..
                              Надо будет прикрепить в топ лучшего говнокода :)
                              Ответить
    • Что-то они там не понимают в Микрософт. Если сделать аборт, то детей быть не должно. Этож ясно. А тут как-то наоборот.
      Ответить
    • Может в finally пишут, что-бы CreateProcess не генерил исключение?
      Ответить
      • В блоке finally исключения генерируются и не обрабатывается.
        Ответить
    • Методы работы с unmanaged-кодом должны быть целостными, чтобы избежать утечки ресурсов.

      Возможности прервать CreateProcess нет, а значит - процесс должен быть создан до конца.
      Ответить
    • http://bober-maniac.livejournal.com/415429.html
      Ответить
      • Помоему ты пидорас.
        Ответить
      • Не, смысл не в том, что они пытаются избежать траблов с CreateProcess, а в том, что ВНЕЗАПНОЕ кидание ThreadAbort в поток - это говноподход. В яве тоже есть Thread.stop, который бросает исключение ThreadDeath, однако его сделали deprecated. Потоки можно безболезненно отменять, если создать всего одну переменную, которую бы поток (скорее всего, пользовательский) проверял. Пожалуйста, не делайте проверки на уровне Process.Start(), и гарантированно не будет ВНЕЗАПНОГО аборта. И не надо городить пустые try'и и оборачивать в finally.
        Ответить
        • Отменён поток или нет, можно делать в серверной библиотеке через всего одно булево значение в TLS-индексе потока, и там, где идёт некий продолжительный цикл, постоянно её самостоятельно коду проверять.

          Ферштейн, инженер с однолетним стажем? :)
          Ответить
          • Дайте возможность разработчикам самостоятельно что-то делать - и жопа, война обеспечена.

            MS и так уже имеет проблемы с тем, что поток, который крутится в CER-регионе в вечном цикле, сбросить, не повредив CLR вообще нельзя. Потому что в отличие от жабы, где все крутится под жесткой виртуальной машиной, защищенной 10 слоями абстракций, CLR гораздо глубже интегрирована в родительскую ось, и многие вещи в ней являются просто гейтами к unmanaged underlayer.

            У CLR должна быть возможность всегда сбросить тот или иной поток, в случае закрытия приложения (что не так важно, там можно работать на низком уровне) или выгрузки домена. Последнее - очень важно, так как домены - это изобретение .NET Framework и ось о них ничего не знает.
            Ответить
            • > Потому что в отличие от жабы, где все крутится под жесткой
              > виртуальной машиной, защищенной 10 слоями абстракций, CLR
              > гораздо глубже интегрирована в родительскую ось, и многие вещи в
              > ней являются просто гейтами к unmanaged underlayer.

              Это заблуждение, виртуальная машина нета - такая, же как у жабы. Просто у нета более прозрачный для программиста способ обращаться к системе (PInvoke). И всё зависит от конкретной платформы, CLR под винду - да, простые гейты, но с точки зрения спецификации "чудная" корреляция между поведением винды и CLR - просто "совпадение". Это особо ни на что не влияет, просто _такая_ логика системы. Логика жабы может быть более понятна линуксу, но мене понятна винде. И? Тьюринг-полная машина может какую- угодно логику переваривать. Под моной, например, под Линукс, сделан слой win-io-layer. И?

              Вот с доменами может быть, да, я там особо не курил :) В любом случае, вырубать поток на полпути должно быть только крайней мерой, это, имхо, всё равно говноархитектура.

              И, разумеется, претензий не было бы, если бы Майкрософт не называло своё детище "кросплатформенным фреймворком". Если бы назвали что-то типа "com+ 2.0" - был бы другой разговор.
              Ответить
              • CLR действительно кросплатформенна, а вот что касается всяческих WinForms и прочих платформо-специфических вещей - тут уже мимо. ECMA реализуешь и все. MS же не обещал, что лично под каждую платформу реализует .NET. Жава тоже кросплатформенна ровно настолько, насколько имеются виртуальные машины. .NET моложе, только и всего.

                Кроме того, CLR организует еще один уровень абстракции и защищает программиста от его собственной глупости (например, от вечного цикла в непрерываемом потоке, хотя, я кажется, об этом уже писал). Защитные абстракции - это последняя брешь обороны в сложном коде. В принципе, никто не мешает не использовать ООП, например, а использовать структуры и процедуры, принимающие их на обработку, однако инкапсуляция помогает выдерживать собственные ограничения.

                Вырубать поток на полпути - действительно, крайняя мера. CLR поступает так в очень редких случаях, и среднестатистический программист на C# никогда не слышал о ThreadAbortException. Однако, в корневой библиотеке нельзя забывать о мелочах.
                Ответить
    • Вполне можно было ввести в язык новую конструкцию, а не городить хаки и костыли.
      Ответить

    Добавить комментарий