"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنك نشر الاستثناءات بين سلاسل الرسائل في C++ باستخدام "exception_ptr"؟

كيف يمكنك نشر الاستثناءات بين سلاسل الرسائل في C++ باستخدام "exception_ptr"؟

تم النشر بتاريخ 2024-11-06
تصفح:412

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 واحد على الأقل يشير إلى كل استثناء لمنع إصداره.
  • خاص بمايكروسوفت: عند استخدام استثناءات SEH مع علامة المترجم /EHa، قد يلتقط رمز المثال أيضًا استثناءات SEH مثل انتهاكات الوصول. وهذا قد لا يكون مرغوبا في جميع الحالات.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3