Ковыряясь в старых исходниках нашего продукта натыкаешься порой на такие трупы в шкафу...
Приложение у нас не просто так, а многопоточное. Потому что серверное. Но так исторически сложилось, что некоторые функции работают с глобальными переменными. Из разных потоков, соответственно. Старые винды от такой наглости выдавали access violation, но "дядя Билл думает о нас" и под xp мелкое хулиганство сходит с рук. Что, впрочем, не означает что в процессе работы одной нити переменная не может быть изменена другой. Что в итоге? Результат работы функции мн... недетерминирован. Кто успел - того и Маша, а кто папа - вскрытие покажет.
И вот тут начинается самое интересное. Мой неизвестный предшественник изучив проблему нашел воистину гениальное решение: если функция выдает что-то совсем уж непотребное, то ее надо вызвать еще раз. И так в цикле десять раз, пока чтонибудь похожее на правильный результат не родится. Правильно, за это время другие потоки уже отработают и оставят многострадальную глобальную переменную в покое... Нетривиальный подход, однако, но ведь работает!
И это уже совсем другой вопрос что будет если результаты работы функции не совсем дикие, а похожие на правду. Ну подумаешь - плюс минус пару байт. Ну влетаем в мертвый цикл, ну повиснет клиент... Из этого цикла мы все равно рано или поздно по access violation вываливаемся и все работает дальше аки новое.
п.с. при одном клиенте поток один и все работает как часы. именно так мы и тестируем, да.
...
много букв про ИТ. Нормальным людям не интересно.
Приложение у нас не просто так, а многопоточное. Потому что серверное. Но так исторически сложилось, что некоторые функции работают с глобальными переменными. Из разных потоков, соответственно. Старые винды от такой наглости выдавали access violation, но "дядя Билл думает о нас" и под xp мелкое хулиганство сходит с рук. Что, впрочем, не означает что в процессе работы одной нити переменная не может быть изменена другой. Что в итоге? Результат работы функции мн... недетерминирован. Кто успел - того и Маша, а кто папа - вскрытие покажет.
И вот тут начинается самое интересное. Мой неизвестный предшественник изучив проблему нашел воистину гениальное решение: если функция выдает что-то совсем уж непотребное, то ее надо вызвать еще раз. И так в цикле десять раз, пока чтонибудь похожее на правильный результат не родится. Правильно, за это время другие потоки уже отработают и оставят многострадальную глобальную переменную в покое... Нетривиальный подход, однако, но ведь работает!
И это уже совсем другой вопрос что будет если результаты работы функции не совсем дикие, а похожие на правду. Ну подумаешь - плюс минус пару байт. Ну влетаем в мертвый цикл, ну повиснет клиент... Из этого цикла мы все равно рано или поздно по access violation вываливаемся и все работает дальше аки новое.
п.с. при одном клиенте поток один и все работает как часы. именно так мы и тестируем, да.
...
много букв про ИТ. Нормальным людям не интересно.
no subject
Date: 11/10/2007 12:13 (UTC)no subject
Date: 11/10/2007 12:14 (UTC)no subject
Date: 11/10/2007 12:18 (UTC)Но судя по форматированию - TurboPascal 3.
no subject
Date: 11/10/2007 12:20 (UTC)