2011-10-07 9 views
5

पर सेगमेंटेशन गलती के साथ अंतःक्रियात्मक रूप से दुर्घटनाग्रस्त हो जाता है मुझे बच्चे के थ्रेड में शामिल होने के दौरान सेगमेंटेशन गलती मिल रही है और मैंने डिबगिंग के बारे में सोचने वाले सभी विकल्पों को समाप्त कर दिया है, स्टैक-ओवरफ्लो और बाकी इंटरनेट पर देख रहे हैं! :) मैं जितनी अच्छी तरह से कर सकता हूं होगा। कोड सी ++ में लिखा गया है और ओएसएक्स 10.6.8 पर जीएनयू जीसीसी के साथ संकलित किया गया है। मैंने '-ththread' पैरामीटर का उपयोग करके 'pthread' लाइब्रेरी में लिंक किया है। मैंने '-lphtread' भी कोशिश की है। कोई फर्क नहीं।pthread_join ओएसएक्स

मैं निम्नलिखित वैश्विक चर का उपयोग कर रहा:

pthread_t gTid; 

pthread_attr_t gAttr; 

int gExitThread = 0; 

मैं निष्पादन के अपने मुख्य धागे से एक बच्चे धागा बना रहा हूं:

err = pthread_attr_init(&gAttr); 
if (err) 
{ 
    throw CONTROLLER_THREAD_ERROR; 
} 

err = pthread_attr_setdetachstate(&gAttr, PTHREAD_CREATE_JOINABLE); 
if (err) 
{ 
    throw CONTROLLER_THREAD_ERROR; 
} 

err = pthread_create(&gTid,&gAttr,threadHandler,NULL); 
if (err) 
{ 
    throw CONTROLLER_THREAD_ERROR; 
} 

अंदर 'threadHandler', मेरे पास निम्न चलाने कोर नींव एपीआई का उपयोग कर पाश:

// Enter run loop 
result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, RUN_LOOP_TIMEOUT, false); 
while (result == kCFRunLoopRunTimedOut) 
{ 
    if (gExitThread) break; 
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, RUN_LOOP_TIMEOUT, false); 
} 

gExitThread वैश्विक चर प्रयोग किया जाता है सिग्नल करने के लिए कि थ्रेड को को गर्व से मारना चाहिए। RUN_LOOP_TIMEOUT मैक्रो 2 सेकंड पर सेट है (हालांकि बड़े और छोटे मान कोई फर्क नहीं पड़ता)।

धागा मुख्य थ्रेड में कोड का निम्न भाग द्वारा मारे जाने के लिए संकेत है:

int err = 0; 
void* exitValue = NULL; 

printf("Stopping controller thread...\n"); 

gExitThread = 1; 
err = pthread_join(gTid, &exitValue); 
if (err) 
{ 
    displayError2(err); 
    throw CONTROLLER_THREAD_ERROR; 
} 

err = pthread_attr_destroy(&gAttr); 
if (err) 
{ 
    throw CONTROLLER_THREAD_ERROR; 
} 

'pthread_join' के लिए कॉल में थोड़ा विलंब के बाद एक विभाजन गलती के साथ दुर्घटनाओं। मैंने यह भी देखा है कि 'pthread_join' की कॉल को सामान्य नींद के साथ दो सेकेंड कहते हैं, 'usleep (2000000)' निष्पादित करते समय सटीक समान सेगमेंटेशन गलती का कारण बनता है! मैं 'pthread_join' और 'usleep' दोनों के लिए नीचे कोर डंप के पीछे का निशान कॉपी करूंगा।

pthread_join:

#0 0x00007fff8343aa6a in __semwait_signal() 
#1 0x00007fff83461896 in pthread_join() 
#2 0x000000010000179d in Controller::cleanup() at src/native/osx/controllers.cpp:335 
#3 0x0000000100008e51 in ControllersTest::performTest (this=0x100211bf0) at unittests/src/controllers_test.cpp:70 
#4 0x000000010000e5b9 in main (argc=2, argv=0x7fff5fbff980) at unittests/src/verify.cpp:34 

usleep (2000000):

#0 0x00007fff8343aa6a in __semwait_signal() 
#1 0x00007fff8343a8f9 in nanosleep() 
#2 0x00007fff8343a863 in usleep() 
#3 0x000000010000177b in Controller::cleanup() at src/native/osx/controllers.cpp:335 
#4 0x0000000100008e3d in ControllersTest::performTest (this=0x100211bf0) at unittests/src/controllers_test.cpp:70 
#5 0x000000010000e5a5 in main (argc=2, argv=0x7fff5fbff980) at unittests/src/verify.cpp:34 

किसी भी मदद की बहुत सराहना की जाएगी।

उत्तर

8

ऐसा लगता है कि threadHandler के अंदर आपके लूप के बाद कोड एक सेगफॉल्ट पैदा कर रहा है। यदि एक थ्रेड के अंदर एक संकेत उत्पन्न होता है (उदा। एसआईजीएसईजीवी), प्रक्रिया ही मारे जायेगी।

सभी धागे के लिए बैकट्रैक प्राप्त करने के लिए GDB और thread apply all bt का उपयोग करने का प्रयास करें।

+0

धन्यवाद मिलान। वह बिल्कुल था! यह पता चला है कि मेरे धागे में मैं कक्षा के लिए एक पूर्ण सूचक कास्टिंग कर रहा था और फिर उस उदाहरण के डेटा सदस्यों तक पहुंचने पर यह दुर्घटनाग्रस्त हो गया। न केवल यह तय है, मैं धागे और जीडीबी के बारे में थोड़ा और जानता हूँ :) – lawrenceB