Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - multithread & exception-safe

Ответить
Настройки темы
Теория - multithread & exception-safe
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Доброго времени суток. Чисто теоретический вопрос: пусть есть процесс, который наплодил классов, потом разделился на несколько нитей, каждая из которых наделала своих классов. В некоторый момент в одной нити произошло исключение. Как оно правильно должно быить обработано (имеется ввиду последовательность раскрутки стека).
В однонитевом процессе всё понятно, раскручиваем до ближайшего блока try..catch либо до конца программы. А вот что делать, когда одну из нитей, вызвавшую исключение, докрутим до места её основания? Завершать все остальные нити или прекратить раскрутку?

Отправлено: 15:37, 11-12-2007

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


podsyp, а статьи почитать при этом лень?
SEH -- это потокозависимый механизм, т.е. свой для каждого потока.Поэтому если его не установить в потоке,то исключение,которое произойдёт в этом потоке,не будет поймано.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 19:13, 02-03-2008 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


DillerInc, Во-первых SEH и плюсовые (или шарповые) исключения это всё-таки разные вещи (хотя в VC++ плюсовые исключения, вроде, сделаны поверх SEH. По-крайней мере, раньше были). Во-вторых, podsyp именно о потокозависимости и сказал.

-------
http://ivank.ru


Отправлено: 23:35, 02-03-2008 | #12


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Просто он это сказал так,словно бы Америку открыл.В то время как этому есть вполне нормальное объяснение.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 11:39, 03-03-2008 | #13

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


а что происходит, если во втором потоке выплыло исключение, но неперехватилось? убивается только поток или вся программа?

Отправлено: 12:28, 07-03-2008 | #14


Новый участник


Сообщения: 10
Благодарности: 2

Профиль | Отправить 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


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата pva:
а что происходит, если во втором потоке выплыло исключение, но неперехватилось? убивается только поток или вся программа? »
...похоже,что вся программа.Дело в том,что система,не найдя ни одного SEH-обработчика,готового обработать возникшее исключение,передаёт последнее т.н. финальному обработчику,который выставляется самой ОС.А ему походу уже всё равно,в каком потоке всё это произошло.

podsyp, вы статьи читали?Вы думаете,что этот "шарп" за вас всё сделает,а вам останется только нажать на кнопочку компиляция...??

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:31, 07-03-2008 | #16


Новый участник


Сообщения: 10
Благодарности: 2

Профиль | Отправить PM | Цитировать


Мне кажется, что вы ищете проблему там, где её нет. Ну не нравится вам шарп, ну создайте вы аналогичную программу на С++. Да, слово SEH красивое. Но это не повод изучать компилятор, а тем более переделывать его. Я больше чем уверен, что в С++ что то похожее можно изобразить, но придётся иметь дело с WinAPI (CreateThread, Callback и т.д.) и код на десять строчек не получится как в шарпе. А суть в ворохе программного кода теряется. Поэтому и возникают вопросы: "А что будет если я буду перехватывать исключение, созданное в одном потоке, в другом потоке?" Многопоточность задумывалась как возможность одновременного независимого выполнения разных задач. Это примерно так, что у вас работает Word и Excel, Word грохается, а увидеть мы это должны в Excel. Знаю, знаю я перепутал процессы с потоками и всё такое. Но по моему, то как работает компилятор шарпа - это правильно. Да есть хороший приём, когда мы не видим throw, а есть блок try - catch. Он генерируется в методах классов, которые мы используем. Можем даже отнаследовавшись генерировать свои исключения. Видимо всё это и рождает подобные вопросы. Вроде thread.Start() и есть вызов метода. Это заблуждение. Извините за прямоту. Удачи.

Отправлено: 19:44, 07-03-2008 | #17


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата podsyp:
Мне кажется, что вы ищете проблему там, где её нет. »
...мне же кажется,что вы пытаетесь закрыть глаза на имеющуюся проблему.
Цитата podsyp:
Да, слово SEH красивое. Но это не повод изучать компилятор, а тем более переделывать его. »
...причём здесь красивое слово?И компилятор здесь также непричём.SEH является сервисом,предоставляемым операционной системой.Просто он относительно плохо документирован.
Цитата podsyp:
Я больше чем уверен, что в С++ что то похожее можно изобразить »
...никаких WinAPI.Используется простая компиляторная обёртка в виде блока _try/ _except/ _finally.

Короче,вам решать.Будете ли вы дальше продолжать "спать" под нежный шелест вашего ЯВУ,либо попытаетесь разобраться во всем,как следует.Во втором случае необходимо первым делом в принудительном порядке читать Гордона:
http://www.wasm.ru/article.php?article=GordonExcept
Ну,а дальше можно и Мэта Питрека.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 01:40, 08-03-2008 | #18


Новый участник


Сообщения: 10
Благодарности: 2

Профиль | Отправить 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


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


podsyp, эээ...вы не путайте,пожалуйста,вкусное со сладким.То,что вы пытаетесь тут растолковать,попадает уже под разряд синхронизации,а вовсе не внутрипоточной обработки исключений.
Да,такое извращение,как вы тут описали,может иметь место.Но представьте это на практике: вы запускаете два потока,один из которых ничего не делает,а только ждёт события,которое оповестит о произошедшей в другом потоке ошибке.Получается,что по логике возникновение ошибки в вашем коде является почти запланированным, т.е. вы специально пишете кривой код полный багов на славу "гениальных" творений мелкомягких?!

Хорошо,запланированные исключения иногда могут дать большие возможности,например,программа,которая трассирует сама себя с помощью исключения EXCEPTION_SINGLE_STEP.Но наверно ни одному трезвомыслящему программисту не придёт в голову использовать для этого объекты синхронизации именно в таком виде,как вы описали.

Если вы хотите отлаживать программу,то не изобретайте велосипед,используйте DebugAPI.Там вы и будете ловить все исключения,как отладочные события.
Цитата podsyp:
Не надо менять службы операционной системы. Не надо менять компилятор. »
...вы хорошо читаете?Никто ничего менять не собирается.Достаточно просто воспользоваться тем,что есть.
Цитата podsyp:
А задурить башку - всегда пожалуйста. »
...вам её к сожалению уже походу и задурили.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:18, 09-03-2008 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - multithread & exception-safe

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Ошибка - 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




 
Переход