2011-11-18 10 views
10

मैं एक प्रोग्राम है जो एक अलग therad में कुछ कार्रवाई, चलाता है तो इसी प्रकार के धागे पर मिलती है, है:वेलग्रिंड जब बूस्ट धागे के साथ काम करने की रिपोर्ट है 'संभवतः खो दिया' स्मृति

#include <boost/thread.hpp> 
#include <iostream> 

using namespace std; 

void f() { 
    for (int i = 0; i < 100; ++i) cout << i << endl; 
} 

int main() { 
    boost::thread t(f); 
    t.join(); 
    return 0; 
} 

अगर मैं चलाने वेलग्रिंड इस पर, यह 'संभावित रूप से खो' स्मृति की रिपोर्ट करता है। यह तार्किक लगता है अगर मैं join() को छोड़ देता हूं, क्योंकि उस स्थिति में जब प्रोग्राम निकलता है तो थ्रेड अभी भी चल रहा है। लेकिन अगर धागा खत्म हो गया है, तो मैं उम्मीद करता हूं कि कोई चेतावनी नहीं है।

यहाँ पश्व-अनुरेखन है:

==8797== 288 bytes in 1 blocks are possibly lost in loss record 2 of 3 
==8797== at 0x4A1F8B3: calloc (vg_replace_malloc.c:467) 
==8797== by 0x400F289: allocate_dtv (in /lib64/ld-2.4.so) 
==8797== by 0x400F34D: _dl_allocate_tls (in /lib64/ld-2.4.so) 
==8797== by 0x53EF981: [email protected]@GLIBC_2.2.5 (in /lib64/libpthread-2.4.so) 
==8797== by 0x4B3311D: boost::thread::start_thread() (in /home/egbomrt/BOOST/inst_1_47_0/lib/libboost_thread.so.1.47.0) 
==8797== by 0x40A20C: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (thread.hpp:204) 
==8797== by 0x406295: main (main.cpp:12) 

इस बूस्ट धागा, POSIX थ्रेड के साथ एक समस्या है या यह पूरी तरह से सामान्य है? मैं इसके लिए एक दमन नियम बना सकता हूं, लेकिन अगर यह एक अधूरा धागा है तो मुझे चेतावनी मिल जाएगी, लेकिन जब सभी धागे समाप्त नहीं होते हैं तो यह भी अच्छा होगा।

+3

आप स्वयं को phtread को खत्म कर सकते हैं (बिना बूस्ट के pthread_create/pthread_join का उपयोग करके) – sehe

+2

जीसीसी 4.6.2/बूस्ट 1.48 पर पुन: उत्पन्न नहीं कर सकता है। हालांकि, मुझे 1 ब्लॉक में 8 बाइट्स मिलते हैं "अभी भी पहुंच योग्य"। वैसे, यह बूस्ट के बजाय ' 'के साथ पूरी तरह से ठीक काम करता है। –

+0

@sehe: स्टैकट्रैक से निर्णय लेने के साथ इसमें कुछ भी नहीं है। यह pthread_create() टीएलएस के लिए संरचना आवंटित करता है। देखें http://www.akkadia.org/drepper/tls.pdf। –

उत्तर

4

मुझे पता चला कि समस्या pthread लाइब्रेरी के साथ है। अगर मैं एसयूएसई 10 पर प्रोग्राम चलाता हूं, तो मुझे मेमोरी लीक मिलती है, लेकिन अगर मैं इसे एसयूएसई 11 पर चलाता हूं, तो मुझे समस्या नहीं मिलती है।

मुझे बूस्ट के साथ और बिना एक ही परिणाम मिलते हैं।

टिप्पणियों के लिए धन्यवाद। इससे मुझे समस्या को दूर करने में मदद मिली।

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