"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > आप `exception_ptr` का उपयोग करके C++ में थ्रेड्स के बीच अपवादों का प्रचार कैसे करते हैं?

आप `exception_ptr` का उपयोग करके C++ में थ्रेड्स के बीच अपवादों का प्रचार कैसे करते हैं?

2024-11-06 को प्रकाशित
ब्राउज़ करें:434

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

सी में थ्रेड्स के बीच अपवादों को प्रचारित करना

सी में थ्रेड्स के बीच अपवादों को प्रचारित करने का कार्य तब उत्पन्न होता है जब मुख्य थ्रेड से कॉल किया गया फ़ंक्शन एकाधिक उत्पन्न करता है सीपीयू-गहन कार्य के लिए वर्कर थ्रेड। चुनौती कार्यकर्ता थ्रेड पर होने वाले अपवादों को संभालने और उचित प्रबंधन के लिए उन्हें मुख्य थ्रेड में वापस लाने में निहित है।

पारंपरिक दृष्टिकोण

एक सामान्य दृष्टिकोण यह है कि वर्कर थ्रेड पर विभिन्न प्रकार के अपवादों को मैन्युअल रूप से पकड़ें, उनके विवरण रिकॉर्ड करें, और उन्हें मुख्य थ्रेड पर पुनः डालें। हालाँकि, इस पद्धति की एक सीमा है कि यह केवल अपवाद प्रकारों के एक निश्चित सेट का समर्थन करती है। भविष्य में पेश किए गए किसी भी नए अपवाद प्रकार के लिए कोड में मैन्युअल संशोधन की आवश्यकता होगी। अपवाद प्रसार के लिए. यह प्रकार थ्रेड्स के बीच अपवादों के परिवहन की अनुमति देता है। ]#शामिल # शामिल करें #शामिल #शामिल करें स्थिर std::exception_ptr eptr; शून्य कार्यकर्ता() { कोशिश { // विलंब के साथ सिम्युलेटेड सीपीयू-गहन कार्य std::this_thread::sleep_for(std::chrono::secs(1)); फेंको std::runtime_error("कार्यकर्ता थ्रेड में अपवाद"); } पकड़ना (...) { eptr = std::current_exception(); } } मुख्य प्रवेश बिंदु() { // एक वर्कर थ्रेड बनाएं std::थ्रेड वर्करथ्रेड(वर्कर); वर्करथ्रेड.जॉइन(); // जांचें कि क्या वर्कर थ्रेड पर कोई अपवाद हुआ है अगर (eptr) { कोशिश { // मुख्य थ्रेड पर अपवाद को पुनः फेंकें std::rethrow_exception(eptr); } पकड़ें (स्थिरांक std::अपवाद &ex) { // मुख्य थ्रेड पर अपवाद को संभालें std::cerr

इस उदाहरण में, वर्कर थ्रेड होने वाले किसी भी अपवाद को पकड़ता है और इसे ईपीटीआर को असाइन करता है। मुख्य थ्रेड पर, ईपीटीआर की जाँच की जाती है और, यदि कोई अपवाद मौजूद है, तो इसे पुनः स्थापित किया जाता है।

एकाधिक वर्कर थ्रेड के लिए नोट

यदि आपके पास एकाधिक वर्कर थ्रेड हैं , आपको किसी भी संभावित अपवाद को पकड़ने के लिए प्रत्येक थ्रेड के लिए अलग-अलग अपवाद_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  

माइक्रोसॉफ्ट-विशिष्ट: /ईएचए कंपाइलर ध्वज के साथ एसईएच अपवादों का उपयोग करते समय, उदाहरण कोड भी कैप्चर किया जा सकता है एसईएच अपवाद जैसे पहुंच उल्लंघन। यह सभी मामलों में वांछनीय नहीं हो सकता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3