У меня есть многопоточное приложение, использующее C ++ (не C ++ 11), использующее pthread. Итак, у меня есть пара потоков, работающих параллельно с соответствующими функциями потоков. В блоке основного потока у меня есть блок try-catch, но в функции потока у меня нет. Каждая функция потока (кроме основной) выполняется в то время как (1) цикл и прерывается, когда основной поток устанавливает определенное условие, указывающее на выход. Проверка и установка условных переменных выполняются в мьютекс-охранниках для обеспечения взаимного исключения. Однако внутри функции потока произошло исключение, и поток превратился в зомби, и приложение упало. Ядро pstack не может правильно показать трассировку стека, так как это могло быть повреждено. Мой вопрос: я должен использовать блок try-catch для обработки исключений с помощью функции потока тоже? Конечно, вне блока try должен быть блок while (1), а блок catch должен корректно обрабатывать исключение, а затем, вероятно, корректно завершаться. Можно ли передать исключение из дочернего потока, переданного во второй поток? В идеале нет. Какой должна быть лучшая практика?
я должен использовать блок try-catch для обработки исключений с помощью функции потока
тоже?
Да, потому что исключения являются механизмом на основе стека. Поскольку каждый поток имеет свой собственный стек, у него есть свои исключения.
Если у вас нет языковой поддержки для передачи исключений, вам придется прибегнуть к «ручному» копированию объекта исключительной ситуации в перехвате и передаче сигнала любому потоку, который должен знать об этом, с помощью некоторых межпоточных коммуникаций, характерных для вашего дизайна.
Других решений пока нет …