Здравствуйте, MaximE, Вы писали:
>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.
Давайте вспомним исходную задачу:
Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.
TerminateThread() (или даже exit()) — заведомо худший вариант.
Если есть штатные рукоятки для экстренного завершения операции — таймауты, альтернативы (select(), WaitForMultipleObjects()), сигналы — то лучше пользоваться ими: мало ли, какие ритуалы и протоколы соблюдаются внутри вызова функции. Но за неимением, или если есть железная уверенность в безопасности данного конкретного кода — то почему бы и не подкинуть исключение?
On Sat, 04 Jun 2005 13:06:12 +0400, Кодт <4783@users.rsdn.ru> wrote:
> Здравствуйте, MaximE, Вы писали: > >>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии. > > Давайте вспомним исходную задачу: > Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.
Как ты из другого потока определишь, что поток заблокирован в системной ф-ции в частности или что сейчас безопасно пробросить в другой поток асинхронное исключение в общем?
Такое решение приведет к UB не только в случае вызова исключения в системеной функции.
Рассмотрим такой код:
class A
{
A();
~A();
};
voif F()
{
A a;
....
}
Предположим, исключение будет перекито в этот поток тогда, когда идет выполнение ....
Предположим, компилятор смог определить, что в .... не кидаются исключения. Тогда не будет сформирован код, гарантирующий вызов декструктора. Впрочем, MaximE уже привел пример со списком. Компилятор ожидает ожидает исключения от throw, а не между произвольными ассемлерными командами.
И вообще, где гаранития, что это хак с подменой eip будет всегда работать корректно?
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, MaximE, Вы писали:
>>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.
К>Давайте вспомним исходную задачу: К>Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом. К>TerminateThread() (или даже exit()) — заведомо худший вариант.
Если исходный поток "зависает" в какой-то системной функции, то таким макаром его нельзя вышибить (во всяком
случае в винде). Все дело в том, что такой поток исключается из очереди готовности (ready queue) и переводится
в waiting queue. Обратно он будет переведен, только после того, как сработает соотв. ожидаемый объект, или истечет
время заданное sleep'ом.
Так что реальное использование такой методы очень сомнительно и небезопасно.
ЗЫ
Проверил на Sleep'е — исключение возникает только после истечения соотв. времени ожидания...
FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, RST_Angellab, Вы писали:
RST>>А если попробовать QueueUserAPC? Вроде бы более гуманный способ, чем кидать эксепшен.
A>В объекте исключения можно много информанции удобно передать. A>Буду думать как подготовить целевой поток...
единственные данные, которые имхо нужно передавать — это укзатель. Все остальное в структуре, на которую этот указатель ссылается.
Последний параметра в QueueuserAPC как раз для этого и предназначен.
В дополнение могу сказать следующее : если код повис (ждет) в ведре, к примеру на Sleep, или на WaitForSingleObject, то suspendthread возможно обломается. Т.к. MSDN гласит :
[quote]
If the function succeeds, execution of the specified thread is suspended and the thread's suspend count is incremented. Suspending a thread causes the thread to stop executing user-mode (application) code.
[/quote]
Т.е. оно работает только для юзермода.
А сокеты уходят в ведро (если не ошибаюсь).
Всякие wait на пайпах тоже туда уходят.
Здравствуйте, adontz, Вы писали:
A>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.
С интересом бы ознакомился , например здесь (e-mail), или любым другим образом!
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, adontz, Вы писали:
A>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.
да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ?
Здравствуйте, Сергей Мухин, Вы писали:
A>>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются. СМ>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ?
Ну зачем же так строго Однако проверка действительно пойдёт на пользу
under «Metallica — Mama Said»,
... << RSDN@Home 1.1.4 beta 7 rev. 462>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Сергей Мухин, Вы писали:
A>>>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются. СМ>>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ?
_FR>Ну зачем же так строго Однако проверка действительно пойдёт на пользу
ну да. вот я например сам все обрабатываю (исключения), без seh. но у меня задача такая. и убиваю (а куда деться) практически так. но я никогда не посоветую делать так другим! да это работает. но, надо отдавать себе отчет, что иногда это не сработает.
я то после этого всеравно закрываю, все. а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++?
Замечательно означает, что в отличие от, например, этих исходников The Code Project: How a C++ compiler implements exception handling
мои не тянут STL и работают не только при синхронной (/EHs), но и при асинхронной (/EHa) обработке исключений (/EHa — позволяет в catch ловить аппаратные исключения) Исходники
Они нагло выдраны, но надеюсь что чтобы заставить это всё скомпилироваться особо мучаться не придёться.
Если будут вопросы — пишите, хотя я уже и не очень хорошо помню как всё работает.
Hit! Типы для RTTI и обработки исключений нигде не описаны, но компилятор о них знает (как будто они встроенные), а отладчик показывает (в окне Watch)
Здравствуйте, Сергей Мухин, Вы писали: A>>>>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются. СМ>>>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ? _FR>>Ну зачем же так строго Однако проверка действительно пойдёт на пользу
СМ>ну да. вот я например сам все обрабатываю (исключения), без seh. но у меня задача такая. и убиваю (а куда деться) практически так. но я никогда не посоветую делать так другим! да это работает. но, надо отдавать себе отчет, что иногда это не сработает. СМ>я то после этого всеравно закрываю, все.
Что Вы имеете в виду? Я просто не могу представить как эти термины выглядят в коде .
сам все обрабатываю — значит ловите все исключения? и убиваю — удаляете объекты исключений?? после этого всеравно закрываю —
СМ>а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.
Да, у меня интерес сугубо академический. Пытаюсь расширить кругозор и вооружиться на будущее.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 462>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++?
A>Замечательно означает, что в отличие от, например, этих исходников A>The Code Project: How a C++ compiler implements exception handling A>мои не тянут STL и работают не только при синхронной (/EHs), но и при асинхронной (/EHa) обработке исключений (/EHa — позволяет в catch ловить аппаратные исключения) A>Исходники A>Они нагло выдраны, но надеюсь что чтобы заставить это всё скомпилироваться особо мучаться не придёться. A>Если будут вопросы — пишите, хотя я уже и не очень хорошо помню как всё работает. A>Hit! Типы для RTTI и обработки исключений нигде не описаны, но компилятор о них знает (как будто они встроенные), а отладчик показывает (в окне Watch)
как они относятся к фиберам? какимим исходниками пользовались 7 или 7.1 там разница есть
Здравствуйте, _FRED_, Вы писали:
_FR> Что Вы имеете в виду? Я просто не могу представить как эти термины выглядят в коде . _FR>
_FR>сам все обрабатываю — значит ловите все исключения?
да UnexceptionHandler
_FR>и убиваю — удаляете объекты исключений??
ну конечно не объекты. я про и слово такое не прозносид. убиваб thread
_FR>после этого всеравно закрываю —
_FR>
мб это трудно представить, у нас тут свой язык, со своей поддержкой. и без seh (хотя планируется и это). и ошибки обрабатываем. вот только две проблемы. thread (ну тут мы пытаемся сказать, что кто запустил, тот пусть и останавливает). и ctrl+c для консольных. тут система свой thread создат, а мы с него пытаемся остановить пользовательский. пока никто не жаловался. но мы то знам, что вовремя нажатый клавишь приводит к """cenzored@@@
СМ>>а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.
_FR>Да, у меня интерес сугубо академический. Пытаюсь расширить кругозор и вооружиться на будущее.
а что тут академического. обычный программистский разговор. программа работать будет, сдать заказчику ее можно, но если она вылетит в момент посадки самолета (читай переключния подстанции (для москвичей)), то что? совесть не будет мучать?
Да уж , простым чтением-запуском там не обойтись, на первый взгляд подчти вся логика в __asm {...}
A>Они нагло выдраны, но надеюсь что чтобы заставить это всё скомпилироваться особо мучаться не придёться. A>Если будут вопросы — пишите, хотя я уже и не очень хорошо помню как всё работает.
Закачал с сайта всю библиотеку (здесь) (некоторых хидеров не хватало), буду разбираться.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 462>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Да уж , простым чтением-запуском там не обойтись, на первый взгляд подчти вся логика в __asm {...}
На самом деле там просто много параметров в регистрах передаётся, на Си такое не обработать.
_FR>Закачал с сайта всю библиотеку (здесь) (некоторых хидеров не хватало), буду разбираться.
Это зря. Там позапрошлогодняя версия. Лучше я на почту новую скину.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>как они относятся к фиберам?
Если честно, то без понятия. Там используется TLS, а не FLS там что могут быть проблемы при одновремнном кидании исключений (А могут и не быть, я в фиберах не силён). Зато вместо _beginthread можно CreateThread использовать.
СМ>какимим исходниками пользовались 7 или 7.1 там разница есть