نشر الاستثناءات بين سلاسل الرسائل في 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