Аварийное завершение параллельного потока
От: LaptevVV Россия  
Дата: 30.10.14 08:40
Оценка: +1
Осваиваю тут параллельные потоки на стандартном С++ — книжка Энтони Уильямса: https://www.ozon.ru/context/detail/id/26893657/
Возник вроде простой вопрос, но никак не найду на него ответа.
Вот запустили мы два треда, которые друг от друга не зависят по данным:
 thread ONE ((NullingGrid_2));        // -- запустили параллельный тред --
 NullingGrid_1(); }
 ONE.join();

NullingGrid_1() — это главный поток, естественно.
Пока аварий нет — все прекрасно.
Допустим, каждый из тредов просит динамическую память.
И может возникнуть bad_alloc.
В главном потоке мы это можем отследить:
thread ONE ((NullingGrid_2));    // -- запустили параллельный тред --
  try
  { NullingGrid_1(); }
  catch(bad_alloc)
  { ONE.join();
    throw;                      // -- передаем дальше --
  }
  ONE.join();

Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.
Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
А мне хотелось бы иметь управляемость в главном потоке.

Надо передавать информацию об аварии главному потоку специально?
Что порекомендуете: условные переменные, будущие результаты?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Аварийное завершение параллельного потока
От: Stanislav V. Zudin Россия  
Дата: 30.10.14 08:56
Оценка: 2 (2) +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.

LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
LVV>А мне хотелось бы иметь управляемость в главном потоке.

Я подпущу еще одного "ежа под череп" (с).
Иногда требуется рулить параллельным потоком, например прервать его.
Собственно проблема того же уровня.

Решение простое — передавать в поток "ручку", за которую можно подёргать.
Рабочий поток может её опрашивать, а не надо ли прекратить работу. И через нее же возвращать результат работы — отработал штатно/был прерван снаружи/завершился аварийно.
Какую именно передавать информацию — зависит от случая/используемых библиотек/принятых соглашений.

Такое вот ИМХО.
_____________________
С уважением,
Stanislav V. Zudin
Re: Аварийное завершение параллельного потока
От: uzhas Ниоткуда  
Дата: 30.10.14 08:57
Оценка: 1 (1) +1 :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Что порекомендуете:


можно начать отсюда: http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads

LVV>будущие результаты?

Re: Аварийное завершение параллельного потока
От: Tilir Россия http://tilir.livejournal.com
Дата: 30.10.14 09:00
Оценка: 30 (2)
Здравствуйте, LaptevVV, Вы писали:

LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.

LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
LVV>А мне хотелось бы иметь управляемость в главном потоке.

Отловить в параллельном потоке исключение. Сохранить через std::current_exception() в объект типа std::exception_ptr, вернуть его (например через future/promise) в главный поток, потом сделать std::rethrow_exception в главном потоке.
Re: Аварийное завершение параллельного потока
От: Pavel Dvorkin Россия  
Дата: 30.10.14 10:20
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.

LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.

Почему он аварийно завершается, если он обработал исключение ?

Что касается самой пробемы — как это на нынешнем С++ лучше сделать — не знаю, так как с ним не работаю. На Win API для взаимодействия потоков (любого, а не только этого) решений много. Ивент, APC, посылка сообщений...
With best regards
Pavel Dvorkin
Re: Аварийное завершение параллельного потока
От: Andrew.W Worobow https://github.com/Worobow
Дата: 30.10.14 10:25
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Осваиваю тут параллельные потоки на стандартном С++ — книжка Энтони Уильямса: https://www.ozon.ru/context/detail/id/26893657/


Создавая потоки руками, вы спускаетесь на низкий уровень, тут подобные "проблемы" не из разряда "проблем", а типа просто работа.
Для паралельного вычисления стандартными средствами всеже лучше пользоваться более высоким уровнем, например просить распаралелить цикл, или ветвь кода.
То есть создавать потоки это средсва, физика, средства для решения проблемы распаралеливания. Точнее одно из средств, и его лучше использовать там где без него не обойтись.
Не все кто уехал, предал Россию.
Re[2]: Аварийное завершение параллельного потока
От: LaptevVV Россия  
Дата: 30.10.14 11:34
Оценка:
Здравствуйте, Tilir, Вы писали:

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


LVV>>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.

LVV>>Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
LVV>>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
LVV>>А мне хотелось бы иметь управляемость в главном потоке.

T>Отловить в параллельном потоке исключение. Сохранить через std::current_exception() в объект типа std::exception_ptr, вернуть его (например через future/promise) в главный поток, потом сделать std::rethrow_exception в главном потоке.

Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Аварийное завершение параллельного потока
От: LaptevVV Россия  
Дата: 30.10.14 12:14
Оценка:
Спасибо всем.
Понятно, что дальше делать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Кстати и опереводе терминов
От: LaptevVV Россия  
Дата: 31.10.14 07:50
Оценка:
U>можно начать отсюда: http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads
LVV>>будущие результаты?
U>
В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс".
Нормально воспринимается. А вот promise переведено как "обещание".
В книге Уильямса — тоже так переведено.
Что можете предложить?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Кстати и опереводе терминов
От: Sashaka Россия  
Дата: 31.10.14 08:56
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

U>>можно начать отсюда: http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads

LVV>>>будущие результаты?
U>>
LVV>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс".
LVV>Нормально воспринимается. А вот promise переведено как "обещание".
LVV>В книге Уильямса — тоже так переведено.
LVV>Что можете предложить?

Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин!

"будущие результаты" тоже доставило.

Не понятно, как вы учите детей, если не в состоянии погуглить или посмотреть как сделано в boost
Re[4]: Кстати и опереводе терминов
От: LaptevVV Россия  
Дата: 31.10.14 09:03
Оценка:
Здравствуйте, Sashaka, Вы писали:

LVV>>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс".

LVV>>Нормально воспринимается. А вот promise переведено как "обещание".
LVV>>В книге Уильямса — тоже так переведено.
LVV>>Что можете предложить?

S>Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин!

S>"будущие результаты" тоже доставило.

S>Не понятно, как вы учите детей, если не в состоянии погуглить или посмотреть как сделано в boost

Давайте отвлечемся от обсуждения моей скромной персоны, и все-таки перейдем к вопросу.
А насчет обработки исключений я уже написал, что спасибо — понятно, что делать.
Дальнейших разъяснений не требуется.
Тем более, что Boost — это не стандарт.
Хотя писал один и тот же человек.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Кстати и опереводе терминов
От: BulatZiganshin  
Дата: 31.10.14 11:04
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин!


а прдеставь каково американцам? недавно читал руссиновича, а там — волокна. тогда как они всю жизнь файберами были. в общем русские книги — зло. пусть их англичане читают
Люди, я люблю вас! Будьте бдительны!!!
Re: Аварийное завершение параллельного потока
От: uncommon Ниоткуда  
Дата: 03.11.14 06:09
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Надо передавать информацию об аварии главному потоку специально?

LVV>Что порекомендуете: условные переменные, будущие результаты?

В этой книге данный вопрос описан в 4.2.4 "Saving an exception for the future". Вообще, полезно заглядывать в индекс. Находишь там, допустим, "исключения", и бам — сразу ответ на твой вопрос.

PS: твой код какой-то небрежный и даже кривой
Re[2]: Аварийное завершение параллельного потока
От: LaptevVV Россия  
Дата: 03.11.14 10:51
Оценка:
Здравствуйте, uncommon, Вы писали:

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


LVV>>Надо передавать информацию об аварии главному потоку специально?

LVV>>Что порекомендуете: условные переменные, будущие результаты?

U>В этой книге данный вопрос описан в 4.2.4 "Saving an exception for the future". Вообще, полезно заглядывать в индекс. Находишь там, допустим, "исключения", и бам — сразу ответ на твой вопрос.


U>PS: твой код какой-то небрежный и даже кривой

Я уже в курсе всего.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Аварийное завершение параллельного потока
От: LaptevVV Россия  
Дата: 03.11.14 11:06
Оценка:
Здравствуйте, uncommon, Вы писали:

U>PS: твой код какой-то небрежный и даже кривой

И кстати, как будет по вашему мнению не кривой код?
Про исключение system_error я тоже в курсе.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Кстати и опереводе терминов
От: Mr.Delphist  
Дата: 03.11.14 11:22
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс".

LVV>Нормально воспринимается. А вот promise переведено как "обещание".
LVV>В книге Уильямса — тоже так переведено.
LVV>Что можете предложить?

Гарантийное обеспечение?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.