Pull to refresh

Интересная задачка: повышаем стабильность (robustness) приложений

Lumber room
Продолжаем отрабатывать корпоративный план по формированию правильного общественного мнения о компании Microsoft и ее технологиях :) Время такое.

Итак, вот вам техническая задачка. Насколько я смог найти, ее разъяснения нет даже у Рихтера. К самому решению я надеюсь придти потом, когда будет возможность «подолее невозбранно» посидеть за компьютером, а пока условие.

Как известно, .Net проектировался с оглядкой на возможность глубокого взаимодействия с нативным кодом и COM. Не будем разбираться сейчас, было ли это техническим или политическим решением, важно вот что — взаимодействие с неуправляемым кодом является сложной проблемой, и может попить немало крови разработчика там, где он не ожидал. Предлагаемая задача — одна из этих.

UPD: Решение тут: habrahabr.ru/blogs/net/69650



Представьте себе следующий код:

IntPtr ptr = Marshal.AllocHGlobal(500); // exception
try
{
   // что-то делаем
}
finally
{
   Marshall.FreeHGlobal(ptr);
}
Код выделяет некоторое (500 байт) количество неуправляемой памяти. Ну выделяет и пусть себе выделяет, ну и что?

А вот что


Представьте себе, что этот код исполняется в отдельном потоке; и в тот момент, когда уже произошло выделение памяти, но до того, как указатель на выделенную область неуправляемой памяти был скопирован в переменную IntPtr, поток был прерван при помощи ThreadAbortException. Выделенная неуправляемая память повиснет в процессе и будет освобождена только по завершению процесса. Это не является проблемой для короткоживущих скриптов, но сильно портит жизнь разработчику долгоживущих приложений — серверов приложений, сервисов и прочего mission-critical софта.

Как бы вы решили эту проблему? И есть ли решение? Скептиков с аргументом «это так маловероятно, поэтому нефиг об этом задумываться» огорчу — если возможность есть, она непременно осуществится; и будет очень печально, если это будет происходить только на production. Пишите, я постараюсь отвечать на комментарии оперативно :)
Tags:
Hubs:
Total votes 17: ↑12 and ↓5 +7
Views 219
Comments Comments 39