Re: Межпотоковое кидание исключений
От: Patalog Россия  
Дата: 04.06.05 08:48
Оценка: 11 (1)
Здравствуйте, adontz, Вы писали:

[]

http://rsdn.ru/Forum/Message.aspx?mid=112490&only=1
Автор: Alex Fedotov
Дата: 10.10.02

Я с такой фигней экспериментировал — работает в зависимости от фазы луны и полагаться на это думаю не стоит.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Почетный кавалер ордена Совка.
Re[4]: Межпотоковое кидание исключений
От: Кодт Россия  
Дата: 04.06.05 09:06
Оценка:
Здравствуйте, MaximE, Вы писали:

>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.


Давайте вспомним исходную задачу:
Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.
TerminateThread() (или даже exit()) — заведомо худший вариант.
Если есть штатные рукоятки для экстренного завершения операции — таймауты, альтернативы (select(), WaitForMultipleObjects()), сигналы — то лучше пользоваться ими: мало ли, какие ритуалы и протоколы соблюдаются внутри вызова функции. Но за неимением, или если есть железная уверенность в безопасности данного конкретного кода — то почему бы и не подкинуть исключение?
Перекуём баги на фичи!
Re[5]: Межпотоковое кидание исключений
От: MaximE Великобритания  
Дата: 04.06.05 12:50
Оценка:
On Sat, 04 Jun 2005 13:06:12 +0400, Кодт <4783@users.rsdn.ru> wrote:

> Здравствуйте, MaximE, Вы писали:

>
>>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.
>
> Давайте вспомним исходную задачу:
> Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.

Как ты из другого потока определишь, что поток заблокирован в системной ф-ции в частности или что сейчас безопасно пробросить в другой поток асинхронное исключение в общем?

Кстати, Patalog привел просто замечательный линк http://rsdn.ru/forum/?mid=1206062
Автор: Patalog
Дата: 04.06.05


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Межпотоковое кидание исключений
От: _Winnie Россия C++.freerun
Дата: 04.06.05 15:08
Оценка:
Здравствуйте, adontz, Вы писали:

Такое решение приведет к UB не только в случае вызова исключения в системеной функции.
Рассмотрим такой код:


class A 
{
  A();
  ~A();
};

voif F()
{
  A a;
  ....
}


Предположим, исключение будет перекито в этот поток тогда, когда идет выполнение ....
Предположим, компилятор смог определить, что в .... не кидаются исключения. Тогда не будет сформирован код, гарантирующий вызов декструктора. Впрочем, MaximE уже привел пример со списком. Компилятор ожидает ожидает исключения от throw, а не между произвольными ассемлерными командами.

И вообще, где гаранития, что это хак с подменой eip будет всегда работать корректно?
Правильно работающая программа — просто частный случай Undefined Behavior
Re[5]: Межпотоковое кидание исключений
От: Игoрь Украина  
Дата: 04.06.05 15:21
Оценка: 58 (6)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, MaximE, Вы писали:


>>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.


К>Давайте вспомним исходную задачу:

К>Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.
К>TerminateThread() (или даже exit()) — заведомо худший вариант.

Если исходный поток "зависает" в какой-то системной функции, то таким макаром его нельзя вышибить (во всяком
случае в винде). Все дело в том, что такой поток исключается из очереди готовности (ready queue) и переводится
в waiting queue. Обратно он будет переведен, только после того, как сработает соотв. ожидаемый объект, или истечет
время заданное sleep'ом.

Так что реальное использование такой методы очень сомнительно и небезопасно.

ЗЫ
Проверил на Sleep'е — исключение возникает только после истечения соотв. времени ожидания...
Re[6]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 17:03
Оценка:
Здравствуйте, adontz, Вы писали:

FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Межпотоковое кидание исключений
От: RST_Angellab  
Дата: 04.06.05 17:56
Оценка:
А если попробовать QueueUserAPC? Вроде бы более гуманный способ, чем кидать эксепшен.
Re[2]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 18:55
Оценка:
Здравствуйте, RST_Angellab, Вы писали:

RST>А если попробовать QueueUserAPC? Вроде бы более гуманный способ, чем кидать эксепшен.


В объекте исключения можно много информанции удобно передать.
Буду думать как подготовить целевой поток...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Межпотоковое кидание исключений
От: RST_Angellab  
Дата: 04.06.05 19:02
Оценка: 6 (1)
Здравствуйте, 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 на пайпах тоже туда уходят.
Re[7]: Межпотоковое кидание исключений
От: _FRED_ Черногория
Дата: 04.06.05 21:01
Оценка:
Здравствуйте, adontz, Вы писали:

A>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.


С интересом бы ознакомился , например здесь (e-mail), или любым другим образом!
under «Metallica — Bleeding Me»,
... << RSDN@Home 1.1.4 beta 7 rev. 462>>
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Межпотоковое кидание исключений
От: Сергей Мухин Россия  
Дата: 04.06.05 21:10
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, adontz, Вы писали:


A>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.


да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ?
---
С уважением,
Сергей Мухин
Re[9]: Межпотоковое кидание исключений
От: _FRED_ Черногория
Дата: 04.06.05 21:16
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

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.
Re[10]: Межпотоковое кидание исключений
От: Сергей Мухин Россия  
Дата: 04.06.05 21:53
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Сергей Мухин, Вы писали:


A>>>>FRED, у меня между прочим есть исходники реализации обработки Си++ исключений. Правда, не спёртые МСные, а свои, но работают замечательно. В любом случае они получены дизассемблированием и медитацией так что от МСных наверное мало отличаются.

СМ>>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++ ?

_FR>Ну зачем же так строго Однако проверка действительно пойдёт на пользу


ну да. вот я например сам все обрабатываю (исключения), без seh. но у меня задача такая. и убиваю (а куда деться) практически так. но я никогда не посоветую делать так другим! да это работает. но, надо отдавать себе отчет, что иногда это не сработает.
я то после этого всеравно закрываю, все. а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.
---
С уважением,
Сергей Мухин
Re[9]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 22:08
Оценка: 12 (1)
Здравствуйте, Сергей Мухин, Вы писали:

СМ>да, интерсно. при этом фраза "замечательно рабатют" не очень понятня. Т.е. пацан отвечает что это будет работать и в моем проекте на С++?


Замечательно означает, что в отличие от, например, этих исходников
The Code Project: How a C++ compiler implements exception handling
мои не тянут STL и работают не только при синхронной (/EHs), но и при асинхронной (/EHa) обработке исключений (/EHa — позволяет в catch ловить аппаратные исключения)
Исходники
Они нагло выдраны, но надеюсь что чтобы заставить это всё скомпилироваться особо мучаться не придёться.
Если будут вопросы — пишите, хотя я уже и не очень хорошо помню как всё работает.
Hit! Типы для RTTI и обработки исключений нигде не описаны, но компилятор о них знает (как будто они встроенные), а отладчик показывает (в окне Watch)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Межпотоковое кидание исключений
От: _FRED_ Черногория
Дата: 04.06.05 22:14
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:
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.
Re[10]: Межпотоковое кидание исключений
От: Сергей Мухин Россия  
Дата: 04.06.05 22:15
Оценка:
Здравствуйте, 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 там разница есть
---
С уважением,
Сергей Мухин
Re[12]: Межпотоковое кидание исключений
От: Сергей Мухин Россия  
Дата: 04.06.05 22:25
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR> Что Вы имеете в виду? Я просто не могу представить как эти термины выглядят в коде .

_FR>
мб это трудно представить, у нас тут свой язык, со своей поддержкой. и без seh (хотя планируется и это). и ошибки обрабатываем. вот только две проблемы. thread (ну тут мы пытаемся сказать, что кто запустил, тот пусть и останавливает). и ctrl+c для консольных. тут система свой thread создат, а мы с него пытаемся остановить пользовательский. пока никто не жаловался. но мы то знам, что вовремя нажатый клавишь приводит к """cenzored@@@

СМ>>а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.


_FR>Да, у меня интерес сугубо академический. Пытаюсь расширить кругозор и вооружиться на будущее.


а что тут академического. обычный программистский разговор. программа работать будет, сдать заказчику ее можно, но если она вылетит в момент посадки самолета (читай переключния подстанции (для москвичей)), то что? совесть не будет мучать?
---
С уважением,
Сергей Мухин
Re[10]: Межпотоковое кидание исключений
От: _FRED_ Черногория
Дата: 04.06.05 22:48
Оценка:
Здравствуйте, adontz, Вы писали:

A>Исходники


Да уж , простым чтением-запуском там не обойтись, на первый взгляд подчти вся логика в __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.
Re[11]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 22:57
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Да уж , простым чтением-запуском там не обойтись, на первый взгляд подчти вся логика в __asm {...}


На самом деле там просто много параметров в регистрах передаётся, на Си такое не обработать.

_FR>Закачал с сайта всю библиотеку (здесь) (некоторых хидеров не хватало), буду разбираться.


Это зря. Там позапрошлогодняя версия. Лучше я на почту новую скину.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 22:59
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>как они относятся к фиберам?


Если честно, то без понятия. Там используется TLS, а не FLS там что могут быть проблемы при одновремнном кидании исключений (А могут и не быть, я в фиберах не силён). Зато вместо _beginthread можно CreateThread использовать.

СМ>какимим исходниками пользовались 7 или 7.1 там разница есть


7.1
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.