2010-01-05 14 views
10

मेरे पास निम्न परीक्षण प्रोग्राम है।`pthread_mutex_trylock 'के लिए अनिर्धारित संदर्भ

#include <iostream> 
#include <cstdlib> 

using namespace std;  
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; 

int main(int argc, char *argv[]) 
{ 
    int iret; 
    iret = pthread_mutex_trylock(& mymutex); 
    cout << "Test2 !!! " << endl; 
    pthread_mutex_unlock(& mymutex); 
    return EXIT_SUCCESS; 
} 

अगर मैं मैं pthread_mutex_trylock के लिए अनसुलझे त्रुटि के लिए त्रुटि मिलती है pthread पुस्तकालय जोड़े बिना यह संकलन है, लेकिन केवल समारोह pthread_mutex_trylock के लिए।

यदि मैं pthread_mutex_trylock के साथ pthread_mutex_trylock को प्रतिस्थापित करता हूं तो प्रोग्राम संकलित और चलाया जाता है -lpthread * विकल्प के बिना भी अच्छी तरह से चलाया जाता है।

अगर मैं जोड़ने के संकलन के लिए -lpthraed विकल्प सभी अच्छी तरह से रन आदेशों यह अच्छी तरह से चलाएँ: $ जी ++ test2.c -ओ test2 -lpthread इस अनसुलझे चेतावनी दी है: $ जी ++ test2.c -ओ test2

उदाहरण त्रुटि उत्पादन: $ जी ++ test2.c -ओ test2 /tmp/ccU1bBdU.o: 'समारोह main': test2.c:(.text+0x11): undefined reference to pthread_mutex_trylock में collect2: ld 1 से बाहर निकलें स्थिति लौटा

अगर मैं instructi की जगह पर iret = pthread_mutex_trylock (& mymutex);

iret = pthread_mutex_lock (& mymutex) के साथ; प्रोग्राम बिना किसी त्रुटि के संकलित और चलाता है, अगर संकलन कमांड पर pthread libarry नहीं जोड़ा गया है, तो मुझे पता है कि अगर मैंने -lpthread विकल्प का उपयोग नहीं किया है, तो मुझे अनसुलझा त्रुटि है, लेकिन मेरे पास ऐसा क्यों नहीं है अन्य pthread_ फ़ंक्शन के लिए भी अनसुलझा त्रुटि?

मैं फेडोरा पर जीसीसी 4.4.2 का उपयोग कर रहा 12

$ g++ --version 
g++ (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20) 
Copyright (C) 2009 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

कुछ ही pthread_mutex_trylock के लिए इस unreference के अर्थ के बारे में कुछ सुझाव है? मदद के लिए

धन्यवाद, एंज़ो

+5

यह कुछ प्लेटफार्म-विशिष्ट व्यवहार हो सकता है, लेकिन आप भी परेशान क्यों हैं? आपको पर्थ्रेड से लिंक करना है, बस इसे करें। –

+0

mybe मुझे अभी भी सीखने की इच्छा है :) – enzo2

+1

फिर भी यह प्रश्न मेरी तरह की स्थिति में उपयोगी है, जहां 'pthread_mutex_lock()' को एक कॉल 'pthread_mutex_trylock()' द्वारा प्रतिस्थापित किया गया था जिससे चीजों को कोई स्पष्ट कारण नहीं तोड़ दिया गया। – foraidt

उत्तर

14

यदि आप pthread फ़ंक्शंस का उपयोग करते हैं तो आपको -lpthread के साथ अपनी ऑब्जेक्ट फ़ाइलों को लिंक करना चाहिए और libc में प्रतीकों को शामिल करने के बारे में चिंता न करें।

इस के पीछे तर्क said है: कुछ समय पहले libc में स्टब्स का उपयोग तब किया जाता था जब थ्रेड का उपयोग करने वाले अनुप्रयोग को थ्रेडिंग समर्थन के बिना सिस्टम पर चलाया जाता था। इस तरह के सिस्टम पर, pthread_* फ़ंक्शंस libc स्टब्स से जुड़े हुए हैं जो त्रुटियों को लौटाते हैं कि कोई थ्रेडिंग कार्यक्षमता नहीं है। "थ्रेडेड" सिस्टम पर रहते हुए वे pthread लाइब्रेरी से जुड़े थे और सही तरीके से काम करते थे।

जाहिर है, pthread_mutex_trylock फ़ंक्शन को -lpthread से जोड़ने के लिए परिवर्तित होने के बाद दिखाई दिया। तो इसके लिए कोई स्टब नहीं है।

+0

धन्यवाद पावेल, अब यह अजीब व्यवहार मैं स्पष्ट रूप से धुंधला हुआ। regars, ebzo – enzo2

+2

बीटीडब्ल्यू, '-lpthread' पोर्टेबल नहीं है, और विशेष रूप से, बीएसडी के पुराने संस्करणों ने' libc_r' का उपयोग किया, 'libpthread' नहीं। इस प्रकार, '-pthread' अधिक पोर्टेबल और अनुशंसित है। –

14

आप -pthread विकल्प के साथ दोनों संकलन और लिंकेज प्रदर्शन करना चाहिए, पोर्टेबल होने के लिए। कुछ प्रणालियों पर, संकलन में विशिष्ट झंडे होंगे (उदा। -D_REENTRANT) -pthread निर्दिष्ट के साथ।

यदि आप यह देखने के लिए उत्सुक हैं कि -pthread आपके संकलन और लिंक झंडे के साथ क्या करेगा, gcc -dumpspecs चलाएं।

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