yajohn: (Default)
[personal profile] yajohn
Ковыряясь в старых исходниках нашего продукта натыкаешься порой на такие трупы в шкафу...

Приложение у нас не просто так, а многопоточное. Потому что серверное. Но так исторически сложилось, что некоторые функции работают с глобальными переменными. Из разных потоков, соответственно. Старые винды от такой наглости выдавали access violation, но "дядя Билл думает о нас" и под xp мелкое хулиганство сходит с рук. Что, впрочем, не означает что в процессе работы одной нити переменная не может быть изменена другой. Что в итоге? Результат работы функции мн... недетерминирован. Кто успел - того и Маша, а кто папа - вскрытие покажет.
И вот тут начинается самое интересное. Мой неизвестный предшественник изучив проблему нашел воистину гениальное решение: если функция выдает что-то совсем уж непотребное, то ее надо вызвать еще раз. И так в цикле десять раз, пока чтонибудь похожее на правильный результат не родится. Правильно, за это время другие потоки уже отработают и оставят многострадальную глобальную переменную в покое... Нетривиальный подход, однако, но ведь работает!

И это уже совсем другой вопрос что будет если результаты работы функции не совсем дикие, а похожие на правду. Ну подумаешь - плюс минус пару байт. Ну влетаем в мертвый цикл, ну повиснет клиент... Из этого цикла мы все равно рано или поздно по access violation вываливаемся и все работает дальше аки новое.

п.с. при одном клиенте поток один и все работает как часы. именно так мы и тестируем, да.
...

много букв про ИТ. Нормальным людям не интересно.

Profile

yajohn: (Default)
yajohn

January 2026

M T W T F S S
   1234
567891011
1213 1415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 21/01/2026 05:02
Powered by Dreamwidth Studios