yigal_s: (Default)
2007-10-14 06:57 pm
Entry tags:

сугубый программизм: мелкомягкие пакости

Обработка исключений под Windows - это что-то особенное.

"всяк знает", что стоит случиться исключению, как начнут вызываться его зарегистрированные обработчики, но, похоже, мало кто озаботился, что будет, если исключение случится в обработчике. Или же, что будет, если сам обработчик уже выгружен.

В XP тут вообще конь не валялся - стоит выгрузить код обработчка, так в ответ на исключение по вызову оного, вся карусель по исполнению обработчиков (уже нового) исключения заверчивается заново. И снова. И снова. Результат - переполнение стека.

В Win 2003 тут понаворотили стра-ашных "защит" - перед вызовом обработчика, проверяют, присутствует ли его код. Или что-то вроде того, я не вдавался. Кажется, правда, что и на XP проверяют, но эта проверка почему-то ничего не ловит. Опять же не вдавался. Короче говоря, в 2003 переполнения стека в этом сценарии не будет. Не будет. В этом сценарии. Зато они умеют, прямо там, выяснив, что обработчик исключения уже выгружен, немедленно корректно закрешить аппликацию. Вызвав (из под ntdll.dll) UnhandledExceptionFilter и всё на него навешенное.

И тут опять вдруг окажется, что если какой из фильтров, навешанных на UnhandledExceptionFilter в памяти ненароком не присутствует, то... обработчик исключений снова пойдет на... искать, где же кончается стек. И очень быстро этот конец обнаружит.
yigal_s: (Default)
2007-08-21 02:04 am
Entry tags:

программизм (скушный, параноидальный)

Вот интересно, как можно абсолютно надежно вызвать следующую функцию Win32 API

SetUnhandledExceptionFilter()

чтобы вновь установленный фильтр мог вызвать старый?


Я бы, пожалуй, вызвал бы её из-под критической секции, а второй вход в ту же критическую секцию поставил бы вокруг считывания значения старого фильтра из-под нового. Дабы избегнуть ситуации, когда SetUnhandledExceptionFilter уже поставила новый фильтр, а старый фильтр (коий SetUnhandledExceptionFilter возвращает) еще не успели сохранить, и в этот самый момент из другого треда прилетает этот самый... unhandled exception и попадает в новый фильтр, у которого еще нет адреса старого.
yigal_s: (Default)
2007-08-08 06:56 pm
Entry tags:

хардкор-программизм: как хороши, как свежи были розы...

Функция IsBadReadPtr и прочие из той же группы очень давно мне не нравились. Ну хотя бы тем, что в данный момент такая функция может выдать тебе, что по данному адресу можно что-то читать, а уже через долю секунды другой тред как-нибудь перераспредилит память, и читать уже не получится. То есть, думал я, не лучше ли сразу читать проблемную память из под try-except блока, не заморачиваясь предварительными проверками?

Реальность, однако, оказалась куда как хуже. Даже в чем-то безнадежной она оказалась.

Выяснилось, что:

если доступ к памяти "наугад", будь он сделан через IsBadReadPtr или же простое чтение памяти из-под try-except блока, нечаянно попадет на guard-страницу стека чужого треда,

то guard-аттрибут этой страницы будет снесён,

что впоследствии, когда стек второго треда подрастет за пределы той бывшей guard-страницы, приведет к "исчерпанию" стека этого треда и катастрофическому и молчаливому завершению всей аппликации.

Конечно, при касании guard-страницы, кидается STATUS_GUARD_PAGE_VIOLATION исключение, и можно было бы попытаться восстановить аттрибут guard-страницы. Можно было бы, если бы не очевидный race-condition: пока мы будем восстанавливаеть аттрибут, второй тред уже может навернуться. Функция же IsBadReadPtr попросту ловит все исключения, и обрабатывает их единообразно, и не пытаясь восстанавливать какие-то там аттрибуты.

И если бы только это...

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

Всё это, кстати, уже документировано на сайте msdn.
yigal_s: (Default)
2007-02-28 04:17 pm

программистское

бляцкий ClearCase
чертов UCM
yigal_s: (Default)
2007-01-30 09:58 pm
Entry tags:

тезисно об exceptions в С++

1. Бытует мнение, что с exceptions программировать значительно сложнее, чем без них без них. Мол, exceptions привносят уйму новых проблем.
На самом деле, если абстрагироваться от мелких заморочек в С++, никаких новых проблем, не известных ранее, exceptions не привносят. По крайней мере, не привносят в то программирование, где не принято игнорировать возвращающиеся из вызова функций коды ошибок или выходить из функции по получении такого кода, не заботясь о консистентности данных.

2. 1991 год. Во втором издании книги "Язык программирование С++" Страуструпа, exceptions было посвящено всего 30 страниц. Всё выглядит просто и красиво.

3. Конец 1994 года. Я тогда прекрасно разбирался в exceptions. В тех самых тридцати страницах. В журнале "С++ Report" появляется статья "Exception handling: a false sence of security", автор которой признается, что, видимо, не способен написать exception-safe стек (!) Вслед за ним свою неспособность сделать это, видимо, должен признать и средний, а то и продвинутый программист С++ того времени.

еще шесть пунктов )
yigal_s: (Default)
2007-01-29 06:54 pm
Entry tags:

программизм: вот такая задачка образовалась

Дан массив из N элементнов. Ну, к примеру, integers
Делается копия этого массива, элементы в ней случайно перемешиваются, а 4 элемента просто выкидываются.
Теперь у нас имеется два массива - из N и N-4 элементов.
-----
Требуется - быстро найти значения удаленных четырёх элементов.

Upd: дополнительное условие - не аллоцировать дополнительных массивов.
yigal_s: (Default)
2007-01-24 06:29 pm
Entry tags:

Мультитрединг - как победить дракона

1. Semaphores
2. Monitors (conditional variables).
3. Messages, рандеву, remote calls, actors (пока не разобрался, одно ли это и то же концептуально, или есть разница. Вообще, в принципе, больше "слышал звон", чем "в теме". Потихоньку разберусь)
4. transactional memory - несколько дней назад где-то ссылку на это дело подобрал.

Интересно, есть еще что-то неупомянутое?

-----
Upd: собственно, в списке представлена некоторая линия эволюции (хотя линейной эволюции в реальности, видимо, не было в точности) способов "синхронизации", вернее, написания мультитредного кода.
yigal_s: (Default)
2007-01-23 06:51 pm
Entry tags:

Мультитредные страшилки

The most important problem with volatile correctness is that it relies on POSIX-like mutexes, and there are multiprocessor systems on which mutexes are not enough — you have to use memory barriers.

(с) Andrei Alexandrescu
http://www.ddj.com/dept/cpp/184403774

Интересно. Поиск на "on which mutexes are not enough" ничего не дал. Неужели никто не заметил?

ПС: редактора, конечно же, на мыло
yigal_s: (Default)
2007-01-23 01:02 pm
Entry tags:

программистско-антисемитскоe

> Проблема с С++ - это сложность в понимании/написании/употреблении мультитрединговой модели с точки зрения организации правильного доступа к данным/синхронизации и т.п.

Чего я не могу понять - это почему POSIX Threads/C code не страдает теми же проблемами, а наоборот есть "наиболее удобное сочетание для написания сложных мульитрединговых програм с элементами real-time".

[ link ]

Я понял, я понял. С++ - это как бы жид в мире языков программирования.

Успешен (но не по праву успешен). Презираем. Критикуем за грехи, коих не совершал. Но оправдания не помогают - ибо с ним всё равно всё понятно.

Примерно так.

Сам [livejournal.com profile] avva тоже писал, что C++ плохой язык, а C хороший. И вот тут, хоть я и иначе ощущаю проблемы языка С++, по сути, а не по мелочам вряд ли можно возразить.

Хотя... вот интересно, если иметь всего две альтернативы: писать системы средней и большой сложности на С, или писать на С++ - выберет ли хоть кто-нибудь С? Ну да, выберет. Ведь уже сказано - "наиболее удобное сочетание для написания сложных мульитрединговых программ с элементами real-time".
yigal_s: (Default)
2006-12-22 09:11 pm
Entry tags:

забавная мелочевка (переключение тредов)

Написал функциональность, позволяющую переходить с одного windows thread на другой в пределах одной функции.

Read more... )
yigal_s: (Default)
2006-12-21 12:05 pm
Entry tags:

программистское. Заметки на полях + сообщения для синхронизации

* Вот тут очень убедительно утверждается и соблазнительно описывается, что для concurrent программирования правильно использовать не семафоры, даже не conditional variables, а передачу сообщений. Крайне заинтригован. В своё время мне не хватило времени и желания разобраться с распределёнными алгоритмами (попадались черезчур математизированные книги с неясными перспективами практического использования изученного), но, похоже, непременно надо будет вернуться к теме.

* Cтрауструп написал дополнительное (современное) предисловие к "Design and Evolution of C++" http://www.research.att.com/~bs/DnE2005.pdf Излагает прошедшую историю с момента написания книги, текущий статус, возможные перспективы на ближайшие десять лет. К С++ у меня сейчас очень сложное отношение, но факт остается фактом - от этого языка я пока никуда не ушел, а для проектов, которыми я занимался последние лет десять, он был вполне адекватен, по большей части.

* Когда познакомился с Object-oriented, очень быстро обнаружил, что мыслю уже не на уровне алгоритмов, функциональностей или модулей, а на уровне классов. Вообще, было бы интересно подыскать какие-то задачи, примеры, где объектно-ориентированный подход не просто не очень удачен или проблематичен, но и в принципе уводит от более эффективного и адекватного решения.
yigal_s: (Default)
2006-12-17 10:39 am
Entry tags:

программистское: Новые синхронизации Майкрософта

Microsoft, оказывается, уже официально признал ненадёжность PulseEvent и призывает использовать вместо них conditional variables, которые наконец-то появились на Windows Vista.

Забавно, что cond-vars в исполнении Microsoft-a можно использовать не только с мютексами, но и... с read-write locks (которые microsoft тоже в vista имплементировал. Вообще, чего они там только не сделали, даже для создания синглтонов дают специальную функциональность).

Возвращаясь к cond-vars, непонятно, есть ли хоть какой-то смысл в их сочетании с read-write lock, помимо того, чтобы чуток больше быстродействия выжать в некоторых случаях экстремальной загрузки процессора. Упс... нет, пожалуй, уже понятно.
yigal_s: (Default)
2006-12-16 10:52 pm
Entry tags:

программистское. Какие языки программирования стоит учить (via avva)

У [livejournal.com profile] avva здесь зашел разговор, какие языки программирования стоит учить.

Жаль, но мне об этом особо нечего сказать. Всё пожрал хомяк C++.

До него учил я и APL и Forth и (не очень успешно, как сейчас понимаю) Lisp и Planner. После него - ничего. Лишь чтение Мейреса, Александреску и Саттера, шлифовка деревянного клинка. Про partial template specialisations прочитал где-то около 97-го года наверное, долго страдал от отсутствия поддержки оных в используемых компиляторах, потом и думать забыл об этом. Тем временем, мимо пролетели как boost (вот уж в чем, жаль, не удалось поучаствовать), так и C++0x.
yigal_s: (Default)
2006-09-27 12:13 pm
Entry tags:

помогите кто чем может?

тривиальная проблема с приемом проф-интервью (у программистов):

давая сложную задачу, даже и "задачу на сообразительность", никогда не можешь быть уверен, что человек, на ней завалившийся, не был бы вполне полезен для реального дела.

давая простую задачу, не можешь быть уверен, что человек, её решивший, что-то может не совсем тривиальное в реальности.

Конечно, можно и нужно следить, как человек рассуждает в ходе даже и нерешенной задачи, но иметь некий набор не очень сложных, но показательных задач, которые человек был бы "обязан" решить, и это бы убедительно и достоверно свидетельствовало об его уровне, тоже очень бы хотелось.
yigal_s: (Default)
2006-06-26 10:35 am
Entry tags:

программистское: открылось ужасное

"Nearly All Binary Searches and Mergesorts are Broken"

"A bug can exist for half a century"

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

остальное тож повеселило:

"It is not sufficient merely to prove a program correct; you have to test it too."
yigal_s: (Default)
2006-06-15 07:57 pm
Entry tags:

Sitting on a fence (программистское)

Казалось бы, чудо произошло.

Начиная с Visual C++ 2005, внутри кода можно расставлять memory barriers, написав, к примеру, вызов intrinsic функции

_ReadWriteBarrier();

Мало того, в спецификацию volatile-типов добавлено долгожданное: операции над ними имеют семантику memory barriers.

И всё бы ничего, но Read more... )
yigal_s: (Default)
2006-04-02 03:52 pm
Entry tags:

(no subject)

По поводу серии книг Саттера и вообще всей этой бучи GOW - следует задать вопрос, в какой степени обсуждаемые там вопросы действительно и объективно релевантны для программирования, а в какой отражают лишь малоудачные стороны дизайна широко используемо языка С++ и помимо этого ценности не имеют.
yigal_s: (Default)
2006-03-29 05:03 pm
Entry tags:

Я фигею, дорогая редакция ...

В Windows fункция InterlockedExchange (речь именно о ней, а не об InterlockedCompareExchange)
имплементирована через cmpxchg и цикл.
Read more... )