2015-11-13 11 views
6

-std=c++11 निर्दिष्ट करते समय एक प्रोग्राम को संकलित करते समय सीधे या अप्रत्यक्ष रूप से std::thread का उपयोग -pthread का संकेत नहीं देता है? यह अजीब लगता है कि हुड के नीचे pthreads का उपयोग कर std::thread के कार्यान्वयन विस्तार प्रोग्रामर के संपर्क में है; यदि उपयोगकर्ता को पॉज़िक्स-संगत थ्रेडिंग लाइब्रेरीज़ का विकल्प देने का मामला है, तो क्यों न केवल pthreads के लिए डिफ़ॉल्ट है और कुछ --threading-model=<your_favorite_posix_threads_library> तर्क को ओवरराइड करने के लिए तर्क है?जीसीसी और क्लैंग में std :: धागे के उपयोग के लिए आवश्यक क्यों है?

+2

यदि आप "जी + सी ++ -pthread -std = C++ 11'" के रूप में "जीसीसी के लिए जीसीसी" के बारे में सोचते हैं तो यह आपकी मदद करेगा और परिभाषा में शब्दावली के बारे में चिंता न करें? –

+1

@KerrekSB यह सीएमकेक्यूसीओएफ_एफएलजीएस (माइक्रोसॉफ्ट का कंपाइलर अज्ञात झंडे के बारे में शिकायत करता है लेकिन उन्हें अनदेखा करता है) या प्लेटफ़ॉर्म/'find_library' सशर्तों को रखने के लिए सीएमके का उपयोग करते समय वास्तव में क्रॉस-प्लेटफ़ॉर्म होने का प्रयास करते समय दर्द होता है, खासकर यदि अंततः व्यवहार _does_ अंत में बदल रहा है। मुझे मिली एक मेलिंग सूची 'find_package (थ्रेड)' का उपयोग करके सुझाई गई, लेकिन यह जीसीसी या क्लैंग के साथ काम नहीं कर रहा है। मैं एक समाधान की तलाश नहीं कर रहा हूं क्योंकि मुझे पहले से ही पता है कि क्या करना है, मैं सिर्फ यह पता लगाने की कोशिश कर रहा हूं कि वे इस तरह से क्यों व्यवहार करते हैं। क्या यह सिर्फ पीछे की तरफ है? – JAB

+0

मुझे नहीं लगता कि एक कारण है। किसी ने व्यवहार को बदलने के लिए बहुत अधिक परवाह नहीं की, जिसे प्री-सी ++ 11 कंपाइलर से विरासत में मिला था। – SergeyA

उत्तर

2

-pthread विकल्प std::thread का उपयोग करने के लिए सार्वभौमिक रूप से आवश्यक नहीं है - यह आपके द्वारा निर्मित किए जा रहे प्लेटफ़ॉर्म के कार्यान्वयन क्विर्क है।

संकलन:

#include <thread> 
#include <iostream> 

int main() 
{ 
    std::thread t{[]() 
     { 
      std::cout << "Hello World\n"; 
     }}; 
    t.join(); 
    return 0; 
} 

clang -std=c++11 ThreadTest.cpp -lc++ 

MacOSX पर साथ, बनाता है और रन, और अगर हम ऐसा करते हैं:

otool -L a.out 
a.out: 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.0.0) 

हम देख सकते हैं कि हम से जोड़ने के लिए की जरूरत गया है यह काम करने के लिए कुछ भी अतिरिक्त नहीं है - न ही यह दृश्यों के पीछे हुआ है। ऐसा लगता है कि यह एक मंच कार्यान्वयन विस्तार है कि pthreads एक अलग पुस्तकालय है।

पर्थ्रेड इंटरफ़ेस के साथ थ्रेडिंग लाइब्रेरीज़ की पसंद होने के बाद * एनआईक्स सिस्टम पर विरासत सामान है, जिनमें से कई थ्रेड समर्थन के बिना शुरू हो गए हैं, फिर पूर्ण कर्नेल समर्थन होने से पहले उपयोगकर्ता-स्पेस थ्रेड के चरण से गुजर चुके हैं। मुझे लगता है कि यह अभी भी वहां है क्योंकि कोई भी तोड़ने में बदलाव करना पसंद नहीं करता है।

+0

"मुझे लगता है कि यह अभी भी वहां है क्योंकि कोई भी ब्रेकिंग बदलाव नहीं करना पसंद करता है" लेकिन चूंकि आपको किसी भी तरह से std :: thread का उपयोग करने के लिए कोड बदलना है, इसलिए मुझे यह नहीं दिख रहा है कि अगर कोई और निर्दिष्ट नहीं है तो lpthread को मानने के लिए इसे कैसे परिभाषित किया जाए कुछ तोड़ देगा? – Voo

+1

जिस बदलाव का मैं जिक्र कर रहा था वह किसी भी प्रोग्राम में libpthread को शामिल करने की आवश्यकता थी जो कुछ प्लेटफॉर्म पर थ्रेडिंग का उपयोग करता है। सी ++ 11 अनुपालन उपकरण और पुस्तकालय सी ++ 03 कोड-बेस के लिए काफी हद तक पिछड़े हैं। एक को वास्तव में आश्चर्य करना होगा कि क्यों एक अलग पुस्तकालय में pthreads अभी भी फैल गया है। – marko

+1

वैसे यह दिलचस्प है। जिज्ञासा से, यदि आप क्लैंग के साथ निर्माण करते हैं तो ओएसएक्स पर सी ++ लाइब्रेरी का उपयोग किया जाता है लेकिन '-lC++' निर्दिष्ट नहीं करते हैं? – JAB

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