2012-05-01 14 views
11

मैंने ग्रहण में सी ++ 11 धागे के उदाहरण का परीक्षण करने की कोशिश की।सीडीटी/ग्रहण सी ++ 11 थ्रेड के साथ कैसे काम करें?

terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted'

मेरे प्रणाली: ubuntu + जीसीसी 4.7

कार्यक्रम: लेकिन मैं इस संदेश को जब कार्यक्रम चल रहा मिला

#include <iostream> 
#include <thread> 

void worker() 
{ 
    std::cout << "hello from worker" << std::endl; 
} 

int main(int argc, char **argv) 
{ 
    std::thread t(worker); 
    t.join(); 
} 

... और हाँ, मैं डाल -std=c++11 और -pthread अंदर C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags

कोई टिप्पणी?

+0

उन सेटिंग्स को "क्रॉस कंपाइलर" अनुभाग में रखने के लिए अजीब लग रहा है (लेकिन मुझे ग्रहण नहीं पता)। क्रैश दोहराया जा सकता है यदि '-pthread' ध्वज कमांड लाइन पर मौजूद नहीं है और आपके पास libstdC++ के अन्य संस्करण स्थापित हैं। तो सुनिश्चित करें कि ध्वज वास्तव में आपके कंपाइलर – Mat

+0

पर पारित किया जा रहा है यह एक रनटाइम अपवाद है, इसलिए कोड सही ढंग से संकलित करता है। फिर भी मैं समझ नहीं पा रहा हूं कि किस मामले में यह अपवाद संदेश होना चाहिए ... – Klaim

+1

@Klaim: अगर आप गलत libstdC++ के खिलाफ लिंक करते हैं तो यह त्रुटि आती है, जो तब हो सकती है यदि आपके पास इसके कई संस्करण स्थापित हैं और आप ' pthread' (या आपका जीसीसी इंस्टॉल borked है) – Mat

उत्तर

10

समस्या जोनाथन वाकीली की टिप्पणी से हल हो गई थी।

मैंने -pthread से C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags जोड़ा और कार्यक्रम सही ढंग से काम किया।

धन्यवाद जोनाथन।

+0

मेरे लिए यह था ... -> सीसीसी सी ++ लिंकर -> विविध -> लिंकर झंडे – gsamaras

0

ईक्लीप्स में सी ++ 11 std::thread काम करने के लिए, संकलन करते समय -pthread विकल्प देने की आवश्यकता है। हालांकि जो पर्याप्त नहीं है। मेरे Ubuntu 14.04, ग्रहण केपलर और जी ++ 4.9 के साथ में नीचे यह काम करता है:

  1. सही परियोजना पर क्लिक करें और 'गुण'
  2. जाओ करने के लिए 'C/C++ बिल्ड'> 'सेटिंग'> (टैब) 'टूल सेटिंग्स'
  3. पहले 'क्रॉस जी ++ कंपाइलर'> 'विविध'> 'अन्य झंडे' का चयन करें;
    और जोड़ने -pthread के बाद -std=c++11
  4. दूसरा चयन 'क्रॉस जी ++ लिंकर'> 'पुस्तकालय';
    और pthread जोड़ने

अंत में परियोजना को फिर से संकलन (जो बराबर है लाइन -lpthread को आदेश); त्रुटि जाना चाहिए।

यह भी याद रखें कि यदि आप std::thread का उपयोग करते हैं, तो इसकी वस्तु join() कहीं और होनी चाहिए। वरना आप रनटाइम त्रुटि नीचे मिल सकता है:

terminate called without an active exception

1
  1. जाओ परियोजना के लिए> गुण> C/C++ सामान्य> प्रीप्रोसेसर शामिल पथ, आदि> प्रदाता> CDT जीसीसी अंतर्निहित संकलक सेटिंग्स और संलग्न -std=c++11 संकलक करने के लिए ऐनक।

    तुम भी विंडो के लिए जा रहा सभी परियोजनाओं के लिए ऐसा कर सकते हैं> वरीयताएँ> C/C++> निर्माण> सेटिंग> डिस्कवरी और CDT जीसीसी अंतर्निहित संकलक सेटिंग्स चश्मा के लिए -std=c++11 जोड़ देते हैं।

    ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}" 
    
  2. प्रोजेक्ट गुण> C/C++ का निर्माण> सेटिंग> उपकरण सेटिंग> जीसीसी सी ++ संकलक> विविध> अन्य झंडे, -pthread -std=c++11 -Wl,--no-as-needed जोड़ें:

    -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed 
    
  3. प्रोजेक्ट गुण> C/C++ बिल्ड> सेटिंग्स> टूल सेटिंग्स> जीसीसी सी ++ लिंकर> विविध> लिंकर झंडे, -pthread -std=c++11 -Wl,--no-as-needed

    जोड़ें

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

  • कोई संबंधित समस्या नहीं^_^