मैं अगर एक म्युटेक्स बंद कर दिया या एक अगर बयान में अनलॉक हो गया है देखने के लिए तो मैं इसे इस तरह की जांच की जरूरत है ...जांच करें,
if(mutex[id] != 2){
/* do stuff */
}
लेकिन जब मैं जाँच यह जीसीसी मुझे निम्न त्रुटि देता है:
error: invalid operands to binary != (have 'ptherad_mutex_t' and 'int')
तो मैं अगर म्युटेक्स या अवरोधित नहीं है देखने के लिए जाँच कर सकते हैं?
संपादित करें:
मेरी समस्या का एक प्रमुख घटक है कि मेरे धागे (डिजाइन) के द्वारा खुद को सही एक और धागा करने के लिए नियंत्रण पास करने के बाद ताला है। तो जब थ्रेड ए थ्रेड बी थ्रेड ए पर नियंत्रण पास करता है, तो थ्रेड बी कुछ सामान करता है, फिर जब थ्रेड बी किया जाता है तो यह थ्रेड ए अनलॉक करेगा।
समस्या यह है कि अगर थ्रेड बी थ्रेड ए को अनलॉक करने का प्रयास करता है और थ्रेड ए ने अभी तक लॉकिंग पूरी नहीं की है, तो अनलॉक करने के लिए कॉल खो गया है और थ्रेड ए लॉक हो गया है जो मृत लॉक का कारण बनता है।
अद्यतन:
मैं पुनर्निर्माण मेरा कार्यक्रम CAF के सुझाव लेने लेकिन मैं अभी भी समस्या हो रही हूँ। मैंने अपने कार्यक्रम को संरचना कैफ में ढाला है जो कि मैं सबसे अच्छा कर सकता हूं लेकिन मैं यह भी नहीं बता सकता कि अब मृत लॉक का कारण क्या है ... मैंने अपने कोड के साथ मदद के लिए here नया प्रश्न बनाया है।
नीचे कैफ के सुझाव का एक चलने योग्य संस्करण है। मैंने थ्रेड ए के लिए फ़ंक्शन में एक छोटी सी रीडरिंग की, जिसके बिना दोनों थ्रेड ए और थ्रेड बी को उनके निर्माण पर बंद कर दिया गया था, ऐसी स्थिति की प्रतीक्षा करनी जो कभी नहीं बदली।
#include <pthread.h>
int run_a = 0;
pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER;
int run_b = 0;
pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER;
void *a(void *);
void *b(void *);
int main(){
int status;
pthread_t thread_a;
pthread_t thread_b;
pthread_create(&thread_a, NULL, a, (void *)0);
pthread_create(&thread_b, NULL, b, (void *)0);
pthread_join(thread_a, (void **)&status);
pthread_join(thread_b, (void **)&status);
}
/* thread A */
void *a(void *i){
while (1) {
printf("thread A is running\n");
sleep(1);
/* unlock thread B */
pthread_mutex_lock(&lock_b);
run_b = 1;
pthread_cond_signal(&cond_b);
pthread_mutex_unlock(&lock_b);
/* wait for thread A to be runnable */
pthread_mutex_lock(&lock_a);
while (!run_a)
pthread_cond_wait(&cond_a, &lock_a);
run_a = 0;
pthread_mutex_unlock(&lock_a);
}
}
/* thread B */
void *b(void *i){
while (1) {
/* wait for thread B to be runnable */
pthread_mutex_lock(&lock_b);
while (!run_b)
pthread_cond_wait(&cond_b, &lock_b);
run_b = 0;
pthread_mutex_unlock(&lock_b);
printf("thread B is running\n");
sleep(1);
/* unlock thread A */
pthread_mutex_lock(&lock_a);
run_a = 1;
pthread_cond_signal(&cond_a);
pthread_mutex_unlock(&lock_a);
}
}
एक त्वरित नोट, म्यूटेक्स को थ्रेड द्वारा अनलॉक किया जाना चाहिए जो उन्हें बंद कर देता है। यदि आप एक लॉकिंग निर्माण चाहते हैं जिसे एक थ्रेड द्वारा लॉक किया जा सकता है और दूसरे द्वारा अनलॉक किया जा सकता है, तो आपको सेमफोर का उपयोग करना होगा (या उपरोक्त उदाहरण में दिखाए गए अनुसार अपना स्वयं का सेमफोर बनाएं)। वास्तव में बदसूरत सिंक्रनाइज़ेशन बग फसल कर सकते हैं यदि एक थ्रेड एक म्यूट को लॉक करता है और दूसरा इसे –