2012-04-21 16 views
5

मैं एक संरचना पर mutex को लॉक करने के लिए pthread_mutex_trylock का उपयोग कर रहा हूं ताकि इसे किसी भी समय एक ही थ्रेड द्वारा एक्सेस/संशोधित किया जा सके। अगर म्यूटेक्स पहले ही बंद हो चुका है तो मैं कतार/अवरुद्ध करने के बजाए दिनचर्या से वापस आ जाता हूं।`pthread_mutex_trylock` ब्लॉक एक ही समय में दो धागे द्वारा बुलाए जाने पर

यह मेरा कोड की एक बुनियादी रूपरेखा है:

typedef struct { 
    pthread_mutex_t m; 
} myStruct; 

void setupStruct(myStruct* struc) { 
    pthread_mutex_init(&struc->m, NULL); 
} 

void structOp(myStruct* struc) { 

    printf("structOp(): Trying to lock\n"); 

    if(pthread_mutex_trylock(&struc->m) != 0) { 
     printf("structOp(): Lock failed\n"); 
     return; 
    } else { 
     printf("structOp(): Locked\n"); 
     // do some stuff to struct 
     pthread_mutex_unlock(&struc->m); 
    } 
} 

struct इस तरह एक बार initialised है:

myStruct* struc = malloc(sizeof(struc)); 
setupStruct(struc); 

लेकिन, कभी कभी जब दो धागे दोनों कॉल को एक ही समय में एक नियमित फोन trylock पर ब्लॉक लग रहा है। मैं इसे मान रहा हूं क्योंकि यह एक ही समय में दोनों धागे के लिए "लॉक करने का प्रयास कर रहा है" प्रिंट करता है, लेकिन प्रिंट नहीं करता है कि म्यूटेक्स लॉक किया गया था या नहीं। मुझे मूल रूप से pthread_mutex_lock के साथ इस समस्या का सामना करना पड़ा था इसलिए इस कारण से गैर-अवरुद्ध संस्करण की कोशिश की गई, लेकिन यह अभी भी ब्लॉक प्रतीत होता है।

यह हमेशा नहीं होता है, लेकिन जब यह हमेशा होता है पहले दो दिनचर्या पर कॉल करता है। यदि पहले दो कॉल ठीक चलते हैं, तो बाद के कॉल भी ठीक काम करते हैं।

क्या कोई कारण यह ब्लॉक करेगा? क्या मैं किसी अन्य समस्या के कारण गलत तरीके से इस अवरोध को समझ रहा हूं? अगर समस्या कहीं और झूठ बोल सकती है तो मैं अपने कोड के अन्य हिस्सों को पोस्ट कर सकता हूं।

+1

इस के लिए कोई कारण नहीं है ब्लॉक करने के लिए, AFAIK है। शायद कहीं और गलत है। – Mat

+1

सेटअपस्ट्रक्चर() को क्या कहते हैं? इसे किसी भी मौके से एक से अधिक बार नहीं कहा जाता है? –

+0

नए धागे शुरू होने से ठीक पहले, यह निश्चित रूप से केवल एक बार बुलाया जाता है। मुझे लगता है कि अगर कोई समस्या है तो पॉइंटर्स के उपयोग के साथ यह सबसे अधिक संभावना है। क्या ये सही लगता है? मैं 'myStruct * struc = malloc (sizeof (struc)) के साथ संरचना आवंटित कर रहा हूं;'। मैं इस जानकारी के साथ सवाल अपडेट करूंगा। – Matt

उत्तर

8

इस लाइन गलत है:

myStruct* struc = malloc(sizeof(struc)); 

यह नहीं alloate पर्याप्त स्मृति है, तो आप शायद trashing रहे हैं/स्मृति पुन: उपयोग जहां म्युटेक्स एक्सेस करते हैं। sizeof(struc) का उपयोग struc के प्रकार के लिए स्मृति आबंटित करता है, और struc के प्रकार के एक myStruct* है, तो आप केवल एक सूचक (ielikely सिर्फ 4 या 8 बाइट्स)

आप क्या करना चाहिए धारण करने के लिए पर्याप्त स्मृति आवंटित कर रहे हैं

myStruct* struc = malloc(sizeof *struc); 

या

myStruct* struc = malloc(sizeof(myStruct)); 
+0

वाह, मैं अपने structs को लंबे समय से गलत आवंटित कर रहा हूं .. समझाए जाने के लिए धन्यवाद! – Matt

0

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

यदि आपका ओएस वाल्ग्रिंड का समर्थन करता है, तो memcheck और helgrind मॉड्यूल के साथ अपना ऐप देखें।