2009-05-27 4 views
6

मैं एक मास्टर थ्रेड और कुछ वर्कर थ्रेड के साथ एक प्रोग्राम लिख रहा हूं, और मैं सिग्नल हैंडलिंग सही प्राप्त करना चाहता हूं।मास्टर/वर्कर थ्रेड और सिग्नल हैंडलिंग

मास्टर धागा शुरू होता है और सभी आवंटन

मास्टर धागा एक SIGINT संकेत हैंडलर

मास्टर धागे कार्यकर्ता धागे शुरू सेट करना: मेरी समस्या निम्नलिखित है। कार्यकर्ता धागे को विशेष सफाई की आवश्यकता नहीं है, हालांकि वे सिस्टम कॉल या सेमफोर पर सो सकते हैं।

जब SIGINT प्राप्त होता है, मेरी समझ यह है कि केवल एक धागा इसे प्राप्त करता है। तो यदि थ्रेड सिस्टम कॉल या सेमफोर पर सो रहे हैं, तो वे जागृत नहीं होंगे, और मैं pthread_join मेरे वर्कर थ्रेड में सक्षम नहीं होगा और मेरे मास्टर थ्रेड में सभी आवश्यक क्लीनअप कर पाऊंगा।

क्या निम्न सिग्नल हैंडलर मेरी समस्या का समाधान कर सकता है?

void term(int sig) 
{ 
    g_do_cleanup = 1; 
    pthread_kill(worker_1_id, some_other_signal); 
    ... 
    pthread_kill(worker_2_id, some_other_signal); 
} 

क्या मैं उम्मीद करते हैं कि SIGINT प्राप्त होने पर, सभी धागा एक और संकेत के साथ संकेत दिया हो जाएगा, उनके अवरुद्ध कॉल से बाहर निकलना, g_do_cleanup झंडा और शान से बाहर निकलने के देखते हैं।

किसी भी टिप्पणी या लिंक को ठीक से कैसे किया जाए इसका स्वागत है।

संपादित करें: मैं किसी विशेष स्थिति पर प्रतीक्षा करने वाले एकाधिक थ्रेड को जगाने के लिए कोई रास्ता नहीं ढूंढ रहा हूं, इसलिए मुझे नहीं लगता कि pthread_cond_signal दृष्टिकोण वह है जिसे मैं ढूंढ रहा हूं। क्या मैं चाहता हूँ है:

  • कि सभी धागे कि एक अवरुद्ध कॉल पर अवरुद्ध कर रहे हैं देता है इन कॉल से एक रास्ता खोजें।
  • या मुख्य धागे को छोड़कर सभी धागे को मार दें।

उत्तर

4

यह वही है मैं आमतौर पर मुख्य अनुप्रयोग धागा में क्या है:


/* before starting other threads */ 
sigset_t sigs; 
sigemptyset(&sigs); 
sigaddset(&sigs, SIGTERM); 
sigaddset(&sigs, SIGINT); 
/* add other signals to handle */ 
if (pthread_sigmask(SIG_BLOCK, &sigs, 0)) { /* handle error */ } 
/* can start threads now */ 
... 
/* in the main event loop */ 
siginfo_t info; 
if (sigwaitinfo(&sigs, &info) == -1) { /* handle error */ } 
switch(info.si_signo) 
{ 
    case SIGTERM: 
    case SIGINT: /* raise shutdown event */ break; 
    default: /* other actions - log rotation, etc. */ 
} 
... 

इस तरह का संकेत नियमित रूप से आवेदन की घटनाओं बन - कोई विशेष संकेत संदर्भ प्रतिबंध, आदि वेटिंग भी sigtimedwait के माध्यम से एक समय समाप्ति के साथ किया जा सकता है हालांकि, बीएसडी डेरिवेटिव इसका समर्थन नहीं करते हैं।

2

यह मुझे लगता है कि आप जो चाहते हैं वह एक पर्थ्रेड कंडीशन वैरिएबल है, ताकि आप अपने मास्टर थ्रेड से एक "ईवेंट" को गाकर किसी भी संख्या में कई धागे जगा सकें।

अधिक जानकारी के लिए PTHREAD_COND_DESTROY और PTHREAD_COND_BROADCAST के लिए मैन पेज देखें।

+0

हाँ।अधिकतर लोग – Kieveli

+0

धागे करने के लिए pthread या Win32/MFC कार्यान्वयन का उपयोग करते हैं, नहीं, मुझे नहीं लगता कि यह ठीक है, क्योंकि यह मुझे अवरुद्ध चयन कॉल, या sem_wait कॉल से नहीं जगाएगा। शायद मैं अपने सेफफोर्स को एक pthread_condition के साथ प्रतिस्थापित कर सकता हूं, लेकिन सेमफोर अबास्ट्रक्शन वास्तव में मेरे सिंक्रनाइज़ेशन मॉडल को फिट करता है। – shodanex

1

आपकी योजना ठीक लगती है। आप सिस्टम सिग्नल को संभालने के लिए एक थ्रेड को मजबूर कर रहे हैं। आपको अपने कार्यकर्ता धागे में कुछ अन्य सिग्नल को छोड़कर संकेतों को मुखौटा करना होगा जिसमें pthread-sigmask() है।

मुझे लगता है कि मैं मास्टर के बजाए प्रक्रिया सिग्नल को संभालने के लिए एक अलग थ्रेड के साथ जाऊंगा। यह सैमफोर या सिग्वाइट() या सिग्नल हैंडलर चलाने की प्रतीक्षा करते समय हमेशा के लिए प्रतीक्षा करें। संकेत हैंडलर से बाहर pthread-kill कोड ले जाएँ। बस स्विच सेट करें और सिग्नल-प्रतीक्षा थ्रेड को अन्य_सिग्नल को वर्कर थ्रेड पर भेजें और स्वयं से बाहर निकलें।

+0

धागे के बीच संवाद करने के लिए संकेतों का उपयोग गलत दृष्टिकोण है। कई थ्रेड पुस्तकालय सिग्नल के साथ भी काम नहीं करते हैं। थ्रेड लाइब्रेरी द्वारा उल्लिखित शर्त चर के रूप में प्रदान किए गए ट्रेड सिंक्रनाइज़ेशन तंत्र का उपयोग करना बेहतर है। – lothar

+0

संकेत आदिम हैं और आदर्श से बहुत दूर हैं लेकिन उनकी लाइब्रेरी स्पष्ट रूप से उनका समर्थन करती है या वह नहीं पूछेंगे। वह ऐसा कुछ नहीं कर रहा है जो सफलतापूर्वक कई बार नहीं किया गया है। – Duck

+0

यह थ्रेड संचार के बारे में नहीं है, लेकिन थ्रेड समाप्ति के बारे में है। pthread_cancel + एक सिग्नल हैंडलिंग थ्रेड काम कर सकता है – shodanex