Распространение исключений между потоками в C
Задача распространения исключений между потоками в C возникает, когда функция, вызываемая из основного потока, порождает несколько рабочие потоки для работы с интенсивным использованием процессора. Задача заключается в обработке исключений, которые могут возникнуть в рабочих потоках, и их передаче обратно в основной поток для правильной обработки.
Обычный подход
Один из распространенных подходов заключается в том, чтобы вручную перехватывать различные исключения в рабочих потоках, записывать их детали и повторно выдавать их в основной поток. Однако этот метод имеет ограничение: он поддерживает только фиксированный набор типов исключений. Любые новые типы исключений, представленные в будущем, потребуют изменения кода вручную.
Обработка исключений C 11
C 11 представляет типException_ptr, обеспечивая более надежное решение для распространения исключений. Этот тип позволяет передавать исключения между потоками.
Пример реализации
В следующем примере показано, как распространять исключения с помощьюException_ptr:
#include
#include
#include
#include
static std::exception_ptr eptr;
void worker() {
try {
// Simulated CPU-intensive work with a delay
std::this_thread::sleep_for(std::chrono::seconds(1));
throw std::runtime_error("Exception in worker thread");
} catch (...) {
eptr = std::current_exception();
}
}
int main() {
// Create a worker thread
std::thread workerThread(worker);
workerThread.join();
// Check if an exception occurred on the worker thread
if (eptr) {
try {
// Rethrow the exception on the main thread
std::rethrow_exception(eptr);
} catch (const std::exception &ex) {
// Handle the exception on the main thread
std::cerr В этом примере рабочий поток перехватывает любое возникающее исключение и назначает его eptr. В основном потоке проверяется eptr и при наличии исключения оно создается повторно.
Примечание для нескольких рабочих потоков
Если у вас несколько рабочих потоков , вам потребуется поддерживать отдельные экземплярыException_ptr для каждого потока, чтобы перехватывать любые потенциальные исключения.
Дополнительные соображения
- Exception_ptr — это общий тип, подобный указателю, поэтому крайне важно убедиться, что хотя бы одинException_ptr указывает на каждое исключение, чтобы предотвратить их выпуск.
- Специально для Microsoft: при использовании исключений SEH с флагом компилятора /EHa пример кода также может захватывать Исключения SEH, такие как нарушения доступа. Это может быть желательно не во всех случаях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3