2011-12-24 14 views
8

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

map<string, pthread_mutex_t> connectedClientsMutexes; 

    pthread_mutex_t myMutex;//= PTHREAD_MUTEX_INITIALIZER; 
    connectedClientsMutexes.insert(pair<string,pthread_mutex_t>(userName,myMutex)); 
while (1) 
    { 

    pthread_mutex_lock(&connectedClientsMutexes[userName]); 
    // do something here 
    } 

इस उत्पन्न करता है:

phase3: pthread_mutex_lock.c: 312: __pthread_mutex_lock_full: दावा `(- (ई))! = 3 || मजबूत 'असफल रहा।

+0

कोड कभी-कभी काम करता है और कभी-कभी नहीं: S –

उत्तर

8

यह एक म्यूटेक्स की प्रतिलिपि बनाने के लिए अनिर्धारित है। मानचित्र में म्यूटेक्स को पॉइंटर डालने का प्रयास करें।

EDIT यह अपरिभाषित व्यवहार की प्रकृति है। कभी-कभी आप भाग्यशाली (या प्रतीत होते हैं) और कभी-कभी आप नहीं करते हैं।

मानचित्र में एकाधिक म्यूटेक्स की प्रतियों के बजाय आप कई पॉइंटर्स को म्यूटेक्स में डाल देते हैं। तो कुछ इस तरह:

map<string, pthread_mutex_t *> connectedClientsMutexes; 

connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex)); 

pthread_mutex_lock(connectedClientsMutexes[userName]); 

मुमकिन है आप विभिन्न धागे के आस-पास नक्शे से गुजर रहे हैं तो यह ढेर पर उन mutexes आवंटित करने के लिए नहीं है जब तक आप सकारात्मक वे क्षेत्र से बाहर जाने के लिए नहीं जा रहे हैं कर रहे हैं बुद्धिमान होगा। उन्हें ग्लोबल्स के रूप में घोषित करें या गतिशील रूप से उन्हें आवंटित करें और उन्हें pthread_mutex_init() से प्रारंभ करें।

+0

लेकिन मैं एक से अधिक mutex जोड़ना चाहता हूं, अजीब बात यह है कि कोड कभी-कभी चल रहा है और कभी-कभी नहीं चल रहा है :( –

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