पुनरावर्ती म्यूटेक्स का क्या और क्यों को स्वीकार किए गए उत्तर में वर्णित ऐसी जटिल चीज नहीं होना चाहिए।
नेट के आसपास कुछ खुदाई के बाद मैं अपनी समझ को लिखना चाहूंगा।
सबसे पहले, आपको यह महसूस करना चाहिए कि म्यूटेक्स के बारे में बात करते समय , बहु धागा अवधारणाएं निश्चित रूप से शामिल होती हैं। (सिंक्रनाइज़ेशन के लिए म्यूटेक्स का उपयोग किया जाता है। यदि मुझे केवल मेरे कार्यक्रम में 1 धागा है तो मुझे म्यूटेक्स की आवश्यकता नहीं है)
दूसरे, आपको एक सामान्य म्यूटेक्स और एक पुनरावर्ती म्यूटेक्स के अंतर को जानना चाहिए ।
APUE से उद्धृत :
(एक पुनरावर्ती म्यूटेक्स) एक म्यूटेक्स प्रकार है जो एक ही धागे को पहले अनलॉक किए बिना इसे कई बार लॉक करने की अनुमति देता है।
मुख्य अंतर यह है कि एक ही थ्रेड के भीतर , एक पुनरावर्ती लॉक को अनलॉक करने के लिए गतिरोध उत्पन्न नहीं होता है, न ही थ्रेड को ब्लॉक करें।
इसका मतलब यह है कि पुनरावर्ती ताला कभी गतिरोध का कारण बनता है?
नहीं, यह अभी भी सामान्य म्यूटेक्स के रूप में गतिरोध पैदा कर सकता है यदि आपने इसे एक धागे में बिना अनलॉक किए इसे बंद कर दिया है, और इसे अन्य थ्रेड्स में लॉक करने का प्रयास करें।
प्रमाण के रूप में कुछ कोड देखते हैं।
- गतिरोध के साथ सामान्य म्यूटेक्स
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t lock;
void * func1(void *arg){
printf("thread1\n");
pthread_mutex_lock(&lock);
printf("thread1 hey hey\n");
}
void * func2(void *arg){
printf("thread2\n");
pthread_mutex_lock(&lock);
printf("thread2 hey hey\n");
}
int main(){
pthread_mutexattr_t lock_attr;
int error;
// error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_DEFAULT);
if(error){
perror(NULL);
}
pthread_mutex_init(&lock, &lock_attr);
pthread_t t1, t2;
pthread_create(&t1, NULL, func1, NULL);
pthread_create(&t2, NULL, func2, NULL);
pthread_join(t2, NULL);
}
उत्पादन:
thread1
thread1 hey hey
thread2
आम गतिरोध उदाहरण, कोई समस्या नहीं है।
- गतिरोध के साथ पुनरावर्ती mutex
बस इस लाइन को अनकंफर्ट करें
error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
और दूसरे को कमेंट करें।
उत्पादन:
thread1
thread1 hey hey
thread2
हां, पुनरावर्ती म्यूटेक्स भी गतिरोध पैदा कर सकता है।
- सामान्य म्यूटेक्स, एक ही धागे में फिर से
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_mutex_t lock;
void func3(){
printf("func3\n");
pthread_mutex_lock(&lock);
printf("func3 hey hey\n");
}
void * func1(void *arg){
printf("thread1\n");
pthread_mutex_lock(&lock);
func3();
printf("thread1 hey hey\n");
}
void * func2(void *arg){
printf("thread2\n");
pthread_mutex_lock(&lock);
printf("thread2 hey hey\n");
}
int main(){
pthread_mutexattr_t lock_attr;
int error;
// error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_DEFAULT);
if(error){
perror(NULL);
}
pthread_mutex_init(&lock, &lock_attr);
pthread_t t1, t2;
pthread_create(&t1, NULL, func1, NULL);
sleep(2);
pthread_create(&t2, NULL, func2, NULL);
pthread_join(t2, NULL);
}
उत्पादन:
thread1
func3
thread2
डेडलॉक इन thread t1
, इन func3
।
(मैं sleep(2)
यह देखने के लिए आसान बनाने के लिए उपयोग करता हूं कि गतिरोध सबसे पहले अनलॉक करने के कारण होता है func3
)
- पुनरावर्ती म्यूटेक्स, एक ही धागे में फिर से
फिर से, पुनरावर्ती म्यूटेक्स लाइन को अनइंस्टॉल करें और दूसरी लाइन पर टिप्पणी करें।
उत्पादन:
thread1
func3
func3 hey hey
thread1 hey hey
thread2
डेडलॉक इन thread t2
, इन func2
। देख? func3
खत्म हो जाता है और बाहर निकल जाता है, पुन: लोड करने से थ्रेड ब्लॉक नहीं होता है और न ही गतिरोध होता है।
तो, आखिरी सवाल, हमें इसकी आवश्यकता क्यों है?
पुनरावर्ती फ़ंक्शन के लिए (बहु-थ्रेडेड प्रोग्राम में कहा जाता है और आप कुछ संसाधन / डेटा की रक्षा करना चाहते हैं)।
जैसे आपके पास एक बहु धागा कार्यक्रम है, और थ्रेड में एक पुनरावर्ती फ़ंक्शन को कॉल करें। आपके पास कुछ डेटा है जो आप उस पुनरावर्ती फ़ंक्शन में सुरक्षित करना चाहते हैं, इसलिए आप म्यूटेक्स तंत्र का उपयोग करते हैं। उस फ़ंक्शन का निष्पादन थ्रेड ए में अनुक्रमिक है, इसलिए आप निश्चित रूप से पुनरावृत्ति में म्यूटेक्स को फिर से खोलेंगे। सामान्य म्यूटेक्स का उपयोग करें जो गतिरोध का कारण बनता है। और पुनरावर्ती म्यूटेक्स हल करने के लिए का आविष्कार किया गया है।
स्वीकृत उत्तर से एक उदाहरण देखें
पुनरावर्ती म्यूटेक्स का उपयोग कब करें? ।
विकिपीडिया, पुनरावर्ती म्यूटेक्स को बहुत अच्छी तरह से समझाता है। निश्चित रूप से एक पढ़ने के लिए लायक है। विकिपीडिया: Reentrant_mutex