2013-10-14 15 views
5

हैलो मैं सी ++ 11 में धागे के साथ समस्या है। मेरे पास g ++ 4.8.1 के साथ उबंटू 64 बिट 13.10 (परीक्षण) है। मैं कोड संकलन करने की कोशिश की: -std = C++ 11 -pthread -lpthread:सी ++ 11 धागा त्रुटि क्रम

#include <thread> 

void func() 
{ 
    // do some work 
} 

int main() 
{ 
    std::thread t(func); 
    t.join(); 
    return 0; 
} 
विकल्पों के साथ

। संकलन सफल रहा था, लेकिन जब मैं इसे चलाने के लिए कोशिश की, मैं एक त्रुटि प्राप्त किया है:

terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted

+0

क्या आप -pthread -std = C++ 11 के साथ प्रयास कर सकते हैं? (-lpthread के बिना) – sphair

+1

लगता है अन्य लोगों को इस मुद्दे https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201 – log0

उत्तर

2

ऐसा लगता है कि आदेश मामलों, या कम से कम, कि क्या इस सूत्र में कहा जाता है कि है: C++ Threads, std::system_error - operation not permitted?

+1

सही है। और मैं कभी नहीं पता था कि क्यों _exactly_, लेकिन यह भी इसे बताते हैं: मूल रूप से http://stackoverflow.com/questions/18827938/strange-g-linking-behavior-depending-on-arguments-order, अगर आप का उपयोग '-lwhatever' _before_ फ़ाइल जिसे लाइब्रेरी की आवश्यकता है, लिंकर इसे छोड़ देता है क्योंकि इसे अब तक इस्तेमाल किए गए किसी भी प्रतीक को नहीं देखा गया है। – stefan

+0

हां लिंक किए गए पुस्तकालयों को उस फ़ाइल के दाईं ओर होना चाहिए जिसकी आवश्यकता है। लेकिन क्या यह वास्तव में ओपी की समस्या है? ऐसा लगता है कि उबंटू 13.10 पर अन्य लोगों का एक ही मुद्दा है। – log0

5

आप शायद यहां उल्लिखित एक ही समस्या है:
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201

इस ध्वज को अपनी कमांड लाइन में जोड़ें। यह दिए गए पुस्तकालयों से जुड़ने के लिए जी ++ को मजबूर करेगा।

-Wl,--no-as-needed 
6

मुझे लगता है कि अन्य उत्तरों थोड़ा भ्रामक हैं। महत्वपूर्ण यह है कि आपको केवल -pthread की आवश्यकता है। के आदेश में इस झंडा नहीं महत्वपूर्ण है!

-pthread स्वचालित रूप से libpthread साथ लिंक करेगा और यह बहुत सही ढंग से करेंगे। ध्यान दें कि यदि आप इस विकल्प दोनों प्रदान करने के लिए जब और संकलन (सिवाय जब आप निश्चित रूप से एक ही बार में सब कुछ करना,) अपने कोड को जोड़ने की जरूरत है।

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

+0

'-pthread' का उपयोग इस मामले में मदद नहीं करेगा। मेरे पास एक ही वातावरण है, और एकमात्र समाधान है [यह] (http://stackoverflow.com/a/19359353/476681) –