2017-12-07 114 views
5

मैं एक शौक परियोजना पर काम कर रहा था जहां म्यूटेक्स रहस्यमय तरीके से व्यवहार कर रहे थे। मैंने इसे इस टेस्ट केस में उबाला जो स्पष्ट रूप से डेडलॉक होना चाहिए।lpthread ध्वज के बिना जीसीसी लिंक क्यों करता है?

#include <pthread.h> 
#include <stdio.h> 

int main() { 
    pthread_mutex_t test; 
    pthread_mutex_init(&test, NULL); 
    pthread_mutex_lock(&test); 
    pthread_mutex_lock(&test); 
    printf("Took lock twice\n"); 
    return 0; 
} 

हालांकि, जब मैं -lpthread झंडा बिना संकलन, न केवल कार्यक्रम अभी भी संकलित करता है और लिंक, यह भी deadlocking बिना चलाता है। क्यूं कर?

gcc pthread_break.c -o pthread_test -lpthread 
./pthread_test 
    <- deadlocked here 

मैं जीसीसी संस्करण 7.2.0 चल रहा हूँ:

gcc pthread_break.c -o pthread_test 
./pthread_test 
Took lock twice 

-lpthread ध्वज के साथ संकलन की उम्मीद परिणाम अर्जित करता है।

+3

संभावित डुप्लिकेट [pthread stub कार्यों को प्रदान करने के लिए कमजोर प्रतीक द्वारा लागू glibc.so में pthread है?] (Https://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-implemented-by -weak-symbol-to-provide-pthread-stub-functi) – Lanting

+0

संबंधित उत्तरों लेकिन डुप्लिकेट प्रश्न नहीं। –

+1

आप किस मंच का उपयोग कर रहे हैं? शायद मानक पुस्तकालय में पर्थ्रेड फ़ंक्शंस, या डमी संस्करण होते हैं जो हमेशा "अनुपूरक" त्रुटि की रिपोर्ट करते हैं। क्या आप दृढ़तापूर्वक प्रत्येक निकास कोड की जांच करते हैं और त्रुटियों की रिपोर्ट सावधानी से करते हैं? –

उत्तर

1

प्रश्न जानकारी में कमी लगता है - लेकिन ऐसा लगता है दो विकल्प हैं कि:

पहले, म्युटेक्स PTHREAD_MUTEX_RECURSIVE जो एक म्युटेक्स की द्वंद्वयुद्ध लॉकिंग की अनुमति देगा के साथ शुरू किया जाता है - एक रेफरी गिनती प्रबंधित किया जाता है और म्युटेक्स है केवल तब ही मुक्त हो जाता है जब रेफ गिनती 0 होती है। इसका मतलब है कि एक ही थैले में एक ही म्यूटेक्स को कई बार लॉक कर सकता है, लेकिन इसे मुक्त करने के लिए एक को समान मात्रा में अन-लॉक प्रदान करना होगा।

दूसरा, यह है कि इस संस्करण में जीसीसी केवल pthread फ़ंक्शंस के लिए स्टब्स लागू करता है - जिसका अर्थ है कि यदि आप -lpthread लाइब्रेरी को निर्देशित करने वाले लाइब्रेरी को लॉन्च नहीं करते हैं तो लॉक फ़ंक्शंस लागू नहीं होते हैं। यह इस तथ्य से समर्थित है कि विकल्प जोड़ने के बाद, डेडलॉक दिखाई देता है।

मैं यह सुनिश्चित करने के लिए जीसीसी स्रोत पर कोशिश करूँगा कि यह वास्तव में दूसरे विकल्प का परिणाम है - एक अपडेट जोड़ देगा।

नोट: पुस्तकालयों को विशेष रूप से लिंक करने की अनुशंसा की जाती है क्योंकि यह परिणाम पर नियंत्रण की अनुमति देता है - जीसीसी आंतरिक समर्थन पर फ़ॉलबैक अप्रत्याशित व्यवहार का कारण बन सकता है, जैसा कि ऊपर देखा गया है।

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