मैं एक संरचना पर 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
के साथ इस समस्या का सामना करना पड़ा था इसलिए इस कारण से गैर-अवरुद्ध संस्करण की कोशिश की गई, लेकिन यह अभी भी ब्लॉक प्रतीत होता है।
यह हमेशा नहीं होता है, लेकिन जब यह हमेशा होता है पहले दो दिनचर्या पर कॉल करता है। यदि पहले दो कॉल ठीक चलते हैं, तो बाद के कॉल भी ठीक काम करते हैं।
क्या कोई कारण यह ब्लॉक करेगा? क्या मैं किसी अन्य समस्या के कारण गलत तरीके से इस अवरोध को समझ रहा हूं? अगर समस्या कहीं और झूठ बोल सकती है तो मैं अपने कोड के अन्य हिस्सों को पोस्ट कर सकता हूं।
इस के लिए कोई कारण नहीं है ब्लॉक करने के लिए, AFAIK है। शायद कहीं और गलत है। – Mat
सेटअपस्ट्रक्चर() को क्या कहते हैं? इसे किसी भी मौके से एक से अधिक बार नहीं कहा जाता है? –
नए धागे शुरू होने से ठीक पहले, यह निश्चित रूप से केवल एक बार बुलाया जाता है। मुझे लगता है कि अगर कोई समस्या है तो पॉइंटर्स के उपयोग के साथ यह सबसे अधिक संभावना है। क्या ये सही लगता है? मैं 'myStruct * struc = malloc (sizeof (struc)) के साथ संरचना आवंटित कर रहा हूं;'। मैं इस जानकारी के साथ सवाल अपडेट करूंगा। – Matt