2008-09-16 18 views
20

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

क्या गैर-अवरुद्ध pthread_join करने का कोई तरीका है? कुछ प्रकार का समय जुड़ाव भी अच्छा होगा।

कुछ इस तरह:

 
foreach thread do 
    nb_pthread_join(); 
    if still running 
     pthread_cancel(); 

मैं और अधिक मामलों में सोच सकते हैं, जहां एक एक गैर bloking में शामिल होने के लिए उपयोगी होगा।

ऐसा लगता है कि ऐसा कोई फ़ंक्शन नहीं है इसलिए मैंने पहले ही एक वर्कअराउंड कोड किया है, लेकिन यह उतना आसान नहीं है जितना मैं चाहूंगा।

+1

गैर-अवरुद्ध धागा शामिल हो? मैंने सोचा था कि शामिल होना ब्लॉकिंग के बारे में था: –

उत्तर

1

जैसा कि अन्य ने इंगित किया है कि मानक pthread पुस्तकालयों में एक गैर-अवरुद्ध pthread_join उपलब्ध नहीं है।

हालांकि, आपकी कहा गया समस्या (यह गारंटी देने का प्रयास कर रहा है कि आपके सभी धागे प्रोग्राम शट डाउन पर निकल गए हैं) ऐसे फ़ंक्शन की आवश्यकता नहीं है।आप बस कर सकते हैं:

int killed_threads = 0; 
for(i = 0; i < num_threads; i++) { 
    int return = pthread_cancel(threads[i]); 
    if(return != ESRCH) 
     killed_threads++; 
} 
if(killed_threads) 
    printf("%d threads did not shutdown properly\n", killed_threads) 
else 
    printf("All threads exited successfully"); 

(समाप्त हो या नहीं) अपने सूत्र के सभी पर pthread_cancel बुला तो बुला कि आपके धागे के सभी के लिए बंद नहीं होंगे और धागे से बाहर निकलें (स्वच्छ है या नहीं की गारंटी देगा के साथ गलत कुछ भी नहीं है)।

इसे 'सरल' कामकाज के रूप में अर्हता प्राप्त करनी चाहिए।

+22

यह उत्तर गलत है। प्रत्येक धागे पर सफलतापूर्वक 'pthread_cancel' कहा जाता है यह गारंटी नहीं देता है कि सभी धागे निकल गए हैं। हो सकता है कि वे किसी रद्दीकरण बिंदु तक नहीं पहुंच पाएंगे, या यहां तक ​​कि यदि उनके पास भी है, तो मुख्य धागा पहले निर्धारित हो सकता है और 'मुख्य' से वापस आ सकता है, प्रक्रिया को मारने से पहले, अन्य धागे सफाई खत्म कर सकते हैं ... –

0

आप एक बाइट को एक पाइप में धक्का दे सकते हैं क्योंकि इसे समाप्त होने पर अन्य थ्रेड को सिग्नल करने के लिए गैर-अवरोधन के रूप में खोला जाता है, फिर पाइप की स्थिति की जांच करने के लिए एक गैर-अवरुद्ध पढ़ने का उपयोग करें।

1

उत्तर वास्तव में इस पर निर्भर करता है कि आप ऐसा क्यों करना चाहते हैं। यदि आप केवल मृत धागे को साफ करना चाहते हैं, उदाहरण के लिए, शायद "मृत थ्रेड क्लीनर" थ्रेड रखने के लिए यह सबसे आसान है जो लूप और जुड़ता है।

1

मुझे यकीन नहीं है कि आपका क्या मतलब है, लेकिन मुझे लगता है कि आपको वास्तव में जो चाहिए वह प्रतीक्षा है और तंत्र को सूचित करता है।

संक्षेप में, यहां बताया गया है कि यह कैसे काम करता है: आप एक टाइमआउट से संतुष्ट होने की स्थिति की प्रतीक्षा करते हैं। आपका इंतजार होगा खत्म हो गया है, तो:

  • टाइमआउट होता है, या
  • अगर हालत संतुष्ट है।

आप इसे एक लूप में रख सकते हैं और अपने तर्क में कुछ और बुद्धि जोड़ सकते हैं। Pthreads से संबंधित इस के लिए मैंने पाया सबसे अच्छा संसाधन यह ट्यूटोरियल है: पॉज़िक्स थ्रेड प्रोग्रामिंग (https://computing.llnl.gov/tutorials/pthreads/)।

मैं यह भी देखकर बहुत हैरान हूं कि Pthreads में समयबद्ध होने के लिए कोई एपीआई नहीं है।

1

कोई समय pthread_join नहीं है, लेकिन यदि आप अन्य धागे की स्थिति पर अवरुद्ध के लिए इंतजार कर रहे हैं, तो आप समय समाप्त हो उपयोग कर सकते हैं pthread_cond_timed_wait बजाय pthread_cond_wait

2

आप QNX के लिए विकसित कर रहे हैं, तो आप pthread_timedjoin() फ़ंक्शन का उपयोग कर सकते हैं।

अन्यथा, आप एक अलग थ्रेड बना सकते हैं जो pthread_join() को निष्पादित करेगा और उदाहरण के लिए एक सेमफोर सिग्नल करके पैरेंट थ्रेड को अलर्ट करेगा, कि बच्चा थ्रेड पूरा हो जाता है। यह अलग धागा pthread_join() से प्राप्त हो सकता है जो माता-पिता थ्रेड को न केवल बच्चे को पूरा करते हैं, बल्कि यह भी मानता है कि यह कितना मूल्य देता है।

21

आप लिनक्स पर अपने आवेदन चला रहे हैं, आपको लगता है कि पता करने के लिए दिलचस्पी हो सकती है:

int pthread_tryjoin_np(pthread_t thread, void **retval); 

int pthread_timedjoin_np(pthread_t thread, void **retval, 
           const struct timespec *abstime); 

सावधान रहो, के रूप में प्रत्यय यह पता चलता है, "एनपी" का अर्थ है "गैर पोर्टेबल"। वे पॉज़िक्स मानक नहीं हैं, gnu एक्सटेंशन, हालांकि उपयोगी हैं।

link to man page

9

'pthread_join' तंत्र अगर यह वास्तव में आप क्या चाहते करने के लिए होता है एक सुविधा का उपयोग किया जा रहा है। यह ऐसा कुछ नहीं करता है जिसे आप स्वयं नहीं कर सकते हैं, और जहां आप वास्तव में नहीं चाहते हैं, वही कोड जो आप चाहते हैं।

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

अपनी सोच बदलकर शुरू करें। यह एक थ्रेड नहीं है जो फंस जाता है, यह थ्रेड कर रहा था जो फंस जाता है।

+0

कृपया नमूना कोड जोड़ें? मुझे एक ही समस्या है, एक प्रक्रिया दो धागे को बुलाती है और धागे से बाहर निकलने के बाद ही बाहर निकलना चाहिए - यहां कोई भी प्रतिक्रिया नहीं दी गई है कि फोर्क के इंतजार() फ़ंक्शन के समान कुछ कैसे करें। (मैंने इस सवाल को पसंदीदा में जोड़ा है, यह स्वचालित रूप से प्रतिक्रिया देने के बाद मुझे सूचित करेगा) –

+2

एक बूलियन है, जो म्यूटेक्स द्वारा संरक्षित है, जो उस चीज़ की स्थिति को संग्रहीत करता है जिसे आप जानना चाहते हैं। यदि वांछित है, तो बूलियन के परिवर्तन पर आपको संकेत देने के लिए एक शर्त चर का उपयोग करें। –

+0

धन्यवाद। नमूना कोड उपयोगी होगा, लेकिन मैं कहीं और खोजने की कोशिश कर सकता हूं। –

संबंधित मुद्दे