2011-11-30 9 views
8

ओएस तक रोक चर मान सही लगता है, और धागे शान से समाप्त pthreadspthreads, मुझे कैसे पता चलेगा कि प्रक्रिया के अंदर एक और धागा इंतजार नहीं कर रहा है?

मैं दो कार्यकर्ता धागे कि हमेशा के लिए चला के साथ काम, लिनक्स है। व्यस्त होने की बजाय दोनों धागे pthread_cond_wait को कॉल करते हैं जब तक एक संकेत एक नए कार्य के लिए सूचित नहीं करता है। प्रणाली अच्छी तरह से काम करता है।

से अनुरोध है कि वह "जानकारी" धागा तैयार करे जो कुछ डीबगिंग जानकारी प्रिंट करे। जानकारी थ्रेड हर 30 सेकंड में जानकारी को पढ़ने और प्रिंट करने का प्रयास करेगा। इस जानकारी का हिस्सा, मैं प्रत्येक कार्यकर्ता धागे का राज्य बनना चाहता हूं। क्या यह पता लगाना संभव है कि "pthread_cond_wait" में थ्रेड अवरुद्ध है या नहीं? यदि धागा इंतजार कर रहा है pthread_cond_wait तो राज्य == प्रतीक्षा कर रहा है राज्य == चल रहा है।

while ((sharedvaluffer == 0) && (doneflag == 0)) { 
      pthread_cond_wait (&taks_added, &buffer); 
     }  

बेशक हम इसे और अधिक कोड कर सकते हैं। हम उपरोक्त स्निपेट को वैश्विक वैरिएबल में जोड़ सकते हैं जो अंक को लॉक के रूप में चिह्नित करता है। कोड

while ((sharedvaluffer == 0) && (doneflag == 0)) { 
       lock; 
       i_am_waiting = truel 
       unlock 
       pthread_cond_wait (&taks_added, &buffer); 
} 

प्रश्न यह है कि यदि कोई आसान स्केलेबल तरीका है। वेटिंग धागे के ढेर है

Thread 6 (Thread 0x40800940 (LWP 20732)): 
#0 0x00002ba4567a9326 in [email protected]@GLIBC_2.3.2() 
#1 0x00000000007ce2ed in worker(void*)() 
#2 0x00002ba4567a5193 in start_thread() from /lib64/libpthread.so.0 
#3 0x00002ba458a82f0d in clone() from /lib64/libc.so.6 

उत्तर

0

आप इसका उपयोग कर सकते हैं mutex स्वामित्व के लिए पहचानकर्ता के रूप में pthread_self() की वापसी। स्टोर और तुलना करें। चूंकि एक म्यूटेक्स को एक ही थ्रेड द्वारा एक बार में अधिग्रहित किया जा सकता है, आपको पता चलेगा कि कौन सा धागा चल रहा है (प्रतीक्षा नहीं कर रहा है), और जो नहीं हैं।

+1

जो काम नहीं करता है अगर कर्मचारी कुछ म्यूटेक्स लॉक कर रहा है (यानी साझा म्यूटेक्स मामले में) – cateof

+0

क्यों नहीं? प्रत्येक धागे की अपनी आईडी होती है। एक सुलभ 'pthread_t current_owner' रखें और जब भी कार्यकर्ता थ्रेड म्यूटेक्स प्राप्त करता है तो उसे अपडेट करें। आपकी जानकारी धागा तब इस चर को प्रत्येक कार्यकर्ता धागे की आईडी से तुलना करता है। ध्यान रखें कि pthread_t लिनक्स पर 'int' है, लेकिन आम तौर पर अन्य प्रणालियों में एक संरचना है, इस प्रकार आप परमाणुता पर भरोसा नहीं कर सकते हैं, जिसके लिए अतिरिक्त लॉक की आवश्यकता होती है। – jweyrich

0

मुमकिन है आप एक म्युटेक्स जो जब हालत अधिसूचित किया गया है लॉक किया गया है का उपयोग कर रहे यदि हां, तो आपकी जानकारी के सूत्र में, बस उस म्युटेक्स ताला लगा की कोशिश - यदि आप इसे प्राप्त, अच्छी तरह से यह है संभव है कि जब आप नमूना लेंगे, धागा इंतजार कर रहा है, अन्यथा अगर यह अवरुद्ध होगा, तो आप जानते हैं कि धागा यह कर रहा है (यानी यह म्यूटेक्स प्राप्त कर चुका है जिसका अर्थ है कि यह इसके महत्वपूर्ण खंड में है)

+1

इससे धागे में हस्तक्षेप होगा। – akappa

+0

निम का उत्तर अच्छा है। इसके विपरीत। म्यूटेक्स के लिए trylock का उपयोग करना मतलब है कि सफलता पर अन्य धागा सो रहा है।समाधान के साथ समस्या यह है कि mutex_ दोनों कार्यकर्ता धागे – cateof

+0

@akappa द्वारा साझा किया जा सकता है, क्यों? यह एक ट्रायलॉक प्रयास है, अगर यह विफल रहता है, ठीक है, थ्रेड व्यस्त है, अगर यह सफल होता है, तो आप इसे तुरंत छोड़ देते हैं लेकिन आप जानते हैं कि उस समय थ्रेड नींद था। नकारात्मक क्या है? बाद के मामले में आपके पास म्यूटेक्स पर एक अतिरिक्त लॉक/अनलॉक है जिसे अन्य थ्रेड के लिए इंतजार करना पड़ता है - जब तक कि यह कुछ वास्तविक समय का महत्वपूर्ण अनुप्रयोग न हो, मैं इसे एक समस्या के रूप में नहीं देखता!! – Nim

1

आप pthread_mutexattr_getpshared, जहां प्रत्येक धागा pthread_self() की सहायता से अपने राज्य (, चल नहीं चल) पंजीकृत करता है के साथ म्युटेक्स में एक साझा संरचना रों रजिस्टर कर सकते हैं।

स्थिति चर की जांच करने से पहले, आप s[pthread_self()]->state = WAITING सेट कर सकते हैं, और चेक के बाद आप s[pthread_self()]->state = WORKING सेट कर सकते हैं।

संरचना को डिजाइन करना सुनिश्चित करें जैसे कोई दौड़ स्थिति नहीं होगी।

1

मैं साधारण मार्ग पर जाऊंगा और केवल प्रति थ्रेड एक राज्य enum शामिल होगा। प्रत्येक वैचारिक राज्य परिवर्तन से पहले आप राज्य को बदल देंगे।

void worker(void* parm) 
{ 
    threadstate_t *state = (threadstate_t*)parm; 

    /* ... */ 
    while (...) { 
     state->current = STATE_WORKING; 

     /* ... */ 

     state->current = STATE_WAITING; 
     /* res = pthread_cond_wait(cond, mutex); */ 
    } 
} 
फिर अपने interrogration सूत्र में

:

void worker_dbg(void* parm) 
{ 
    threadstate_t *states = (threadstate_t*)parm; 
    int i; 

    while (run) { 
     for (i = 0; i < NWORKERS; ++i) { 
      /* _state is a map of states to strings */ 
      printf("Thread %d: %s\n", states[i].id, _state[states[i].current]); 
     } 
     sleep(30); 
    } 
} 

आप 30 सेकंड के द्वारा बंद हैं, क्योंकि राज्य अपडेट किए गए हैं सही के बाद आप मुद्रित करते हैं, तो यह वास्तव में कोई फर्क नहीं पड़ता। राज्य को लॉक करने की कोई आवश्यकता नहीं है क्योंकि आप केवल मालिक के कार्यकर्ता से ही लिखते हैं और आप केवल डीबग थ्रेड से पढ़ते हैं।

+1

मुख्य सिद्धांत मेरा जैसा ही है, लेकिन आप राज्य को धागे से जोड़ते हैं, जबकि मैं इसे म्यूटेक्स पर करता हूं, इसलिए आपका दृष्टिकोण मेरी तुलना में साफ है। +1 – akappa

+0

आप अपना दृष्टिकोण ले सकते हैं और इसे प्रत्येक म्यूटेक्स को राज्य enum में जोड़कर इसे मेरे अंदर ले जा सकते हैं। जैसा कि आपको इसकी आवश्यकता है, दानेदार के रूप में। – user7116

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