2012-09-29 14 views
6

मैं उपरोक्त कोड का उपयोग 2 धागे का उपयोग करके काउंटर बढ़ाने के लिए कर रहा हूं, जो स्वतंत्र रूप से म्यूट लॉक और वृद्धि काउंटर लेता है। थ्रेड इस फ़ंक्शन में प्रवेश करने के बाद मुझे डेडलॉक का सामना करना पड़ रहा है।pthread_mutex_lock डेडलॉक का कारण बनता है

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; 

void *increment_counter(void *counter_addr) 
{ 
    int max = MAX_COUNTER_VALUE; 
    int iter; 
    int counter; 

    for(iter=0;iter< max ;iter++) 
    // LOCK 
    pthread_mutex_lock(&mut); 
    counter++; 
    // UNLOCK 
    pthread_mutex_unlock(&mut); 
    return NULL; 
} 

क्या कोई मुझे बता सकता है कि मैं वास्तव में गलत कहां जा रहा हूं?

+2

शायद आप 'पूर्णांक * काउंटर = counter_addr' और' ++ * counter' चाहता था: इस उद्देश्य के लिए, आप एक कोड इस के समान है जो pthread_mutex_lock की वापसी कोड की जांच करता है का उपयोग कर सकते हैं। –

उत्तर

10

आप mutex max बार लॉक करने का प्रयास कर रहे हैं, फिर counter बढ़ाएं और इसे एक बार रिलीज़ करें।

प्रयास करें:

for(iter=0;iter< max ;iter++) 
{ 
    // LOCK 
    pthread_mutex_lock(&mut); 
    counter++; 
    // UNLOCK 
    pthread_mutex_unlock(&mut); 
} 
return NULL; 
+1

ओह .. यह एक खराब प्रोग्रामिंग त्रुटि थी .. इसे इंगित करने के लिए धन्यवाद। :) –

3

यही कारण है हो सकता है आप करने की कोशिश की क्या:

int max = MAX_COUNTER_VALUE; 
int iter; 
int counter; 
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; 

void *increment_counter(void *counter_addr) 


{ 

    pthread_mutex_lock(&mut);  
    for(iter=0;iter< max ;iter++) 
     counter++; 
    pthread_mutex_unlock(&mut); 
    return NULL; 
} 
  • 2 या अधिक सूत्र केवल वैश्विक क्षेत्र डेटा या ढेर पर स्थित डेटा साझा (malloc) ।
  • 2 या अधिक धागे स्टैक पर परिभाषित चर साझा नहीं करते हैं डेटा प्रत्येक थ्रेड के लिए अद्वितीय है और इसे लॉक करने की कोई आवश्यकता नहीं है।

आप in the answers, एक ही धागा एक म्युटेक्स एक बार से अधिक ताला नहीं करना चाहिए क्या साझा किया जाता है और क्या साझा नहीं है आदि

0

एक सिद्धांत के रूप में पढ़ने के लिए स्वागत कर रहे हैं और कहा कि यहां क्या हुआ है।

0

लॉक प्रारंभिकरण बहुत महत्वपूर्ण है। यदि आप अपने ताले को सही मान पर प्रारंभ नहीं करते हैं तो आपका कोड टूट जाता है। अपने लॉक आरंभ के लिए एक विधि है निम्नलिखित:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

इसके अलावा, आप निम्नलिखित कोड का उपयोग करके गतिशील इस कार्य को कर सकते हैं:

int rc = pthread_mutex_init(&lock, NULL); 
assert(rc == 0); // always check success! 

ताला आरंभीकरण के अलावा, आप pthread_mutex_lock की वापसी कोड के लिए जाँच करनी चाहिए यह देखने के लिए कि क्या यह विफल रहता है या नहीं, जैसे कि यह विफल रहता है, एकाधिक थ्रेड महत्वपूर्ण खंड में प्रवेश कर सकते हैं।

// Use this to keep your code clean but check for failures 
// Only use if exiting program is OK upon failure 
void Pthread_mutex_lock(pthread_mutex_t *mutex) { 
int rc = pthread_mutex_lock(mutex); 
assert(rc == 0); 
}