«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как вы распространяете исключения между потоками в C++, используя «Exception_ptr»?

Как вы распространяете исключения между потоками в C++, используя «Exception_ptr»?

Опубликовано 6 ноября 2024 г.
Просматривать:761

How do you propagate exceptions between threads in C   using `exception_ptr`?

Распространение исключений между потоками в 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