Осваиваю тут параллельные потоки на стандартном С++ — книжка Энтони Уильямса: https://www.ozon.ru/context/detail/id/26893657/
Возник вроде простой вопрос, но никак не найду на него ответа.
Вот запустили мы два треда, которые друг от друга не зависят по данным:
NullingGrid_1() — это главный поток, естественно.
Пока аварий нет — все прекрасно.
Допустим, каждый из тредов просит динамическую память.
И может возникнуть bad_alloc.
В главном потоке мы это можем отследить:
Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение.
Но! Как мне из параллельного треда сообщить в главный о bad_alloc?
Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
А мне хотелось бы иметь управляемость в главном потоке.
Надо передавать информацию об аварии главному потоку специально?
Что порекомендуете: условные переменные, будущие результаты?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение. LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc? LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним. LVV>А мне хотелось бы иметь управляемость в главном потоке.
Я подпущу еще одного "ежа под череп" (с).
Иногда требуется рулить параллельным потоком, например прервать его.
Собственно проблема того же уровня.
Решение простое — передавать в поток "ручку", за которую можно подёргать.
Рабочий поток может её опрашивать, а не надо ли прекратить работу. И через нее же возвращать результат работы — отработал штатно/был прерван снаружи/завершился аварийно.
Какую именно передавать информацию — зависит от случая/используемых библиотек/принятых соглашений.
Такое вот ИМХО.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, LaptevVV, Вы писали:
LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение. LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc? LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним. LVV>А мне хотелось бы иметь управляемость в главном потоке.
Отловить в параллельном потоке исключение. Сохранить через std::current_exception() в объект типа std::exception_ptr, вернуть его (например через future/promise) в главный поток, потом сделать std::rethrow_exception в главном потоке.
Здравствуйте, LaptevVV, Вы писали:
LVV>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение. LVV>Но! Как мне из параллельного треда сообщить в главный о bad_alloc? LVV>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним.
Почему он аварийно завершается, если он обработал исключение ?
Что касается самой пробемы — как это на нынешнем С++ лучше сделать — не знаю, так как с ним не работаю. На Win API для взаимодействия потоков (любого, а не только этого) решений много. Ивент, APC, посылка сообщений...
Создавая потоки руками, вы спускаетесь на низкий уровень, тут подобные "проблемы" не из разряда "проблем", а типа просто работа.
Для паралельного вычисления стандартными средствами всеже лучше пользоваться более высоким уровнем, например просить распаралелить цикл, или ветвь кода.
То есть создавать потоки это средсва, физика, средства для решения проблемы распаралеливания. Точнее одно из средств, и его лучше использовать там где без него не обойтись.
Здравствуйте, Tilir, Вы писали:
T>Здравствуйте, LaptevVV, Вы писали:
LVV>>Однако! Если случилось в параллельном треде — мы там внутри него поймаем исключение. LVV>>Но! Как мне из параллельного треда сообщить в главный о bad_alloc? LVV>>Потому как параллельный поток аварийно завершается, и весь процесс — вместе с ним. LVV>>А мне хотелось бы иметь управляемость в главном потоке.
T>Отловить в параллельном потоке исключение. Сохранить через std::current_exception() в объект типа std::exception_ptr, вернуть его (например через future/promise) в главный поток, потом сделать std::rethrow_exception в главном потоке.
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
U>можно начать отсюда: http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads LVV>>будущие результаты? U>
В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс".
Нормально воспринимается. А вот promise переведено как "обещание".
В книге Уильямса — тоже так переведено.
Что можете предложить?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
U>>можно начать отсюда: http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads LVV>>>будущие результаты? U>> LVV>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс". LVV>Нормально воспринимается. А вот promise переведено как "обещание". LVV>В книге Уильямса — тоже так переведено. LVV>Что можете предложить?
Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин!
"будущие результаты" тоже доставило.
Не понятно, как вы учите детей, если не в состоянии погуглить или посмотреть как сделано в boost
Здравствуйте, Sashaka, Вы писали:
LVV>>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс". LVV>>Нормально воспринимается. А вот promise переведено как "обещание". LVV>>В книге Уильямса — тоже так переведено. LVV>>Что можете предложить?
S>Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин! S>"будущие результаты" тоже доставило.
S>Не понятно, как вы учите детей, если не в состоянии погуглить или посмотреть как сделано в boost
Давайте отвлечемся от обсуждения моей скромной персоны, и все-таки перейдем к вопросу.
А насчет обработки исключений я уже написал, что спасибо — понятно, что делать.
Дальнейших разъяснений не требуется.
Тем более, что Boost — это не стандарт.
Хотя писал один и тот же человек.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Sashaka, Вы писали:
S>Могу предложить не заниматься ерундой и не переводить. А то читаешь книжку по SIP а там "привратник", блин!
а прдеставь каково американцам? недавно читал руссиновича, а там — волокна. тогда как они всю жизнь файберами были. в общем русские книги — зло. пусть их англичане читают
Здравствуйте, LaptevVV, Вы писали:
LVV>Надо передавать информацию об аварии главному потоку специально? LVV>Что порекомендуете: условные переменные, будущие результаты?
В этой книге данный вопрос описан в 4.2.4 "Saving an exception for the future". Вообще, полезно заглядывать в индекс. Находишь там, допустим, "исключения", и бам — сразу ответ на твой вопрос.
Здравствуйте, uncommon, Вы писали:
U>Здравствуйте, LaptevVV, Вы писали:
LVV>>Надо передавать информацию об аварии главному потоку специально? LVV>>Что порекомендуете: условные переменные, будущие результаты?
U>В этой книге данный вопрос описан в 4.2.4 "Saving an exception for the future". Вообще, полезно заглядывать в индекс. Находишь там, допустим, "исключения", и бам — сразу ответ на твой вопрос.
U>PS: твой код какой-то небрежный и даже кривой
Я уже в курсе всего.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, uncommon, Вы писали:
U>PS: твой код какой-то небрежный и даже кривой
И кстати, как будет по вашему мнению не кривой код?
Про исключение system_error я тоже в курсе.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>В книге Йосутиса (вроде так рекомендуют произносить) использован органичный термин "фьючерс". LVV>Нормально воспринимается. А вот promise переведено как "обещание". LVV>В книге Уильямса — тоже так переведено. LVV>Что можете предложить?