|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - multithread & exception-safe |
|
Теория - multithread & exception-safe
|
Ветеран Сообщения: 1180 |
Профиль | Отправить PM | Цитировать Доброго времени суток. Чисто теоретический вопрос: пусть есть процесс, который наплодил классов, потом разделился на несколько нитей, каждая из которых наделала своих классов. В некоторый момент в одной нити произошло исключение. Как оно правильно должно быить обработано (имеется ввиду последовательность раскрутки стека).
В однонитевом процессе всё понятно, раскручиваем до ближайшего блока try..catch либо до конца программы. А вот что делать, когда одну из нитей, вызвавшую исключение, докрутим до места её основания? Завершать все остальные нити или прекратить раскрутку? |
|
Отправлено: 15:37, 11-12-2007 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать podsyp, а статьи почитать при этом лень?
SEH -- это потокозависимый механизм, т.е. свой для каждого потока.Поэтому если его не установить в потоке,то исключение,которое произойдёт в этом потоке,не будет поймано. |
------- Отправлено: 19:13, 02-03-2008 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать DillerInc, Во-первых SEH и плюсовые (или шарповые) исключения это всё-таки разные вещи (хотя в VC++ плюсовые исключения, вроде, сделаны поверх SEH. По-крайней мере, раньше были). Во-вторых, podsyp именно о потокозависимости и сказал.
|
------- Отправлено: 23:35, 02-03-2008 | #12 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Просто он это сказал так,словно бы Америку открыл.В то время как этому есть вполне нормальное объяснение.
|
------- Отправлено: 11:39, 03-03-2008 | #13 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать а что происходит, если во втором потоке выплыло исключение, но неперехватилось? убивается только поток или вся программа?
|
Отправлено: 12:28, 07-03-2008 | #14 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Здравствуйте.
Высылаю код на С#, связанный с вопросом. Короче говоря - ваше исключение не перехватывается. Программа нормально не работает. А имеет она 1 или несколько потоков выполнения по моему не имеет значения. Удачи. using System; using System.Collections.Generic; using System.Text; namespace ExceptionTester { class Program { static void Main(string[] args) { try { Runner r = new Runner(); r.Start();//здесь запускается новый поток } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } class Runner { private System.Threading.Thread t; public Runner() { t = new System.Threading.Thread(new System.Threading.ThreadStart(thr_func)); } public void Start() { t.Start(); } private void thr_func() { Console.WriteLine("I am started!"); while (true) { System.Threading.Thread.Sleep(100); Console.Read(); throw new Exception("never catched"); } } } } |
Отправлено: 14:48, 07-03-2008 | #15 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата pva:
podsyp, вы статьи читали?Вы думаете,что этот "шарп" за вас всё сделает,а вам останется только нажать на кнопочку компиляция...?? |
|
------- Отправлено: 17:31, 07-03-2008 | #16 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Мне кажется, что вы ищете проблему там, где её нет. Ну не нравится вам шарп, ну создайте вы аналогичную программу на С++. Да, слово SEH красивое. Но это не повод изучать компилятор, а тем более переделывать его. Я больше чем уверен, что в С++ что то похожее можно изобразить, но придётся иметь дело с WinAPI (CreateThread, Callback и т.д.) и код на десять строчек не получится как в шарпе. А суть в ворохе программного кода теряется. Поэтому и возникают вопросы: "А что будет если я буду перехватывать исключение, созданное в одном потоке, в другом потоке?" Многопоточность задумывалась как возможность одновременного независимого выполнения разных задач. Это примерно так, что у вас работает Word и Excel, Word грохается, а увидеть мы это должны в Excel. Знаю, знаю я перепутал процессы с потоками и всё такое. Но по моему, то как работает компилятор шарпа - это правильно. Да есть хороший приём, когда мы не видим throw, а есть блок try - catch. Он генерируется в методах классов, которые мы используем. Можем даже отнаследовавшись генерировать свои исключения. Видимо всё это и рождает подобные вопросы. Вроде thread.Start() и есть вызов метода. Это заблуждение. Извините за прямоту. Удачи.
|
Отправлено: 19:44, 07-03-2008 | #17 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата podsyp:
Цитата podsyp:
Цитата podsyp:
Короче,вам решать.Будете ли вы дальше продолжать "спать" под нежный шелест вашего ЯВУ,либо попытаетесь разобраться во всем,как следует.Во втором случае необходимо первым делом в принудительном порядке читать Гордона: http://www.wasm.ru/article.php?article=GordonExcept Ну,а дальше можно и Мэта Питрека. |
|||
------- Отправлено: 01:40, 08-03-2008 | #18 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Здравствуйте.
Я не расчитываю встретить понимание, но всё же задумайтесь. Не заостряясь на в статье по поводу SEH решалась задача как из одного потока узнать что исключение произошло в другом. Вот как это делается в шарпе на примере исключения деления на ноль: using System; namespace ConsoleApplication4 { public delegate void EventDeledate(object o, ExcEventArgs e); public class ExcEventArgs : EventArgs { public string Message; public ExcEventArgs(string message) { Message = message; } } class Program { private static string _exc_message; static void Main(string[] args) { _exc_message = ""; Console.WriteLine("main thread started"); Runner r = new Runner(); r.OnException += new EventDeledate(r_OnException); r.Run();//запуск другого потока System.Threading.Thread.Sleep(1000);//ожидание события в другом потоке Console.WriteLine(_exc_message);//вывод информации о событии, произошедшей в другом потоке Console.Read(); } static void r_OnException(object o, ExcEventArgs e) { _exc_message = e.Message; } } class Runner { private System.Threading.Thread _thread; public event EventDeledate OnException; public Runner() { _thread = new System.Threading.Thread(new System.Threading.ThreadStart(Thread_Func)); } public void Run() { _thread.Start(); } private void Thread_Func() { try { Console.WriteLine("Another thread started..."); int divisor = 0; int res = 1 / divisor;//генерация исключения } catch (DivideByZeroException ex) { OnException(this, new ExcEventArgs("division by zero!"));//генерация события } } } } Не надо менять службы операционной системы. Не надо менять компилятор. Надо только воспользоватся событиями. Майкрософт пишет очень хороший софт, но очень плохую литературу, объясняющую как этот софт устроен. Поверьте, ни одна фирма не будет разглашать суть и способы создания программного обеспечения. А задурить башку - всегда пожалуйста. |
Отправлено: 12:57, 09-03-2008 | #19 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать podsyp, эээ...вы не путайте,пожалуйста,вкусное со сладким.То,что вы пытаетесь тут растолковать,попадает уже под разряд синхронизации,а вовсе не внутрипоточной обработки исключений.
Да,такое извращение,как вы тут описали,может иметь место.Но представьте это на практике: вы запускаете два потока,один из которых ничего не делает,а только ждёт события,которое оповестит о произошедшей в другом потоке ошибке.Получается,что по логике возникновение ошибки в вашем коде является почти запланированным, т.е. вы специально пишете кривой код полный багов на славу "гениальных" творений мелкомягких?! Хорошо,запланированные исключения иногда могут дать большие возможности,например,программа,которая трассирует сама себя с помощью исключения EXCEPTION_SINGLE_STEP.Но наверно ни одному трезвомыслящему программисту не придёт в голову использовать для этого объекты синхронизации именно в таком виде,как вы описали. Если вы хотите отлаживать программу,то не изобретайте велосипед,используйте DebugAPI.Там вы и будете ловить все исключения,как отладочные события. Цитата podsyp:
Цитата podsyp:
|
||
------- Отправлено: 17:18, 09-03-2008 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ошибка - Exception Processing Messag | newxp | Microsoft Windows 2000/XP | 5 | 26-02-2010 10:43 | |
Драйвер - PCI\VEN_1095&DEV_3132&SUBSYS_71321095&REV_01\4&662654C&0&00E0 | kalion-kill | Поиск драйверов, прошивок и руководств | 1 | 08-11-2009 16:45 | |
Win32 exception | __sa__nya | Microsoft Windows NT/2000/2003 | 3 | 16-03-2007 22:05 | |
WinXP & Win2K & Net & Inet проблема!! Help! | SDL2000 | Сетевые технологии | 5 | 19-10-2003 22:29 |
|