LINUX.ORG.RU

Not handling exceptions in background threads

 ,


0

2

Добрый день!

Читаю статью:
http://www.acodersjourney.com/2017/08/top-20-cplusplus-multithreading-mistakes/
ошибка под номером 12: Exceptions thrown in one thread cannot be caught in another thread.
Лично мне не нравится пример «правильной» обработки
исключительной ситуации с глобальным объектом и повторной
генераций исключения.
Подскажите, как правильно работать с исключениями в «дочерних» нитях.
P.S.
Понятно, что по уму - исключение не должно покидать нить,
но все же, если это произошло, как быть?
P.S.S.
Может у кого завались ссылки на объяснение как работают
исключения в многопоточной среде и как стек
разворачивается при этом.
Спасибо!



Последнее исправление: art_corp (всего исправлений: 1)

Не нравятся глобальные переменные — выдели треду не глобальную, персональную переменную.

anonymous
()

Можно использовать std::promise самому и писать/брать из него исключение, или вызывать поток через std::async, который уже возвращает std::promise и кладёт туда исключение, если оно произошло:

promise = std::async(std::launch::async, &f);

xaizek ★★★★★
()

std::exception_ptr

anonymous
()

если это произошло, как быть?

Это не может произойти в принципе, пока ты сам не наворотишь механизм для этого.

объяснение как работают исключения в многопоточной среде и как стек разворачивается при этом

Тут особо и объяснять нечего: с точки зрения обработки исключений совершенно не важно сколько у тебя потоков. У каждого потока свой независимый стек, и разворачивается он всегда одинаково. Если ты в потоке не поймаешь исключение, вызовется самый обычный terminate().

Подскажите, как правильно работать с исключениями в «дочерних» нитях.

Как тебе удобно так и работай. Если у тебя, например, поток складывает что-то в очередь, можешь предусмотреть в этой очереди хранение исключений наряду с результатом работы. На принимающей стороне можешь работать с этими исключениями напрямую, а можешь их перевыкидывать. Можешь сделать для исключений отдельную очередь. Можешь не делать. Можешь использовать промисы. Можешь не использовать. Можешь вообще исключения полностью обрабатывать в треде и никуда не передавать.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.