mingw-w64 थ्रेड्स: पॉज़िक्स बनाम विन 32


128

मैं विंडोज पर mingw-w64 स्थापित कर रहा हूं और दो विकल्प हैं: win32 थ्रेड और पॉज़िक्स थ्रेड। मुझे पता है कि win32 धागे और pthreads के बीच क्या अंतर है, लेकिन मुझे समझ में नहीं आता कि इन दो विकल्पों के बीच क्या अंतर है। मुझे संदेह है कि अगर मैं पॉज़िक्स थ्रेड्स चुनूंगा तो यह मुझे CreateThread जैसे WinAPI फ़ंक्शन को कॉल करने से रोकेगा।

ऐसा लगता है कि यह विकल्प निर्दिष्ट करता है कि कौन सा थ्रेडिंग एपीआई किसी प्रोग्राम या लाइब्रेरी द्वारा उपयोग किया जाएगा, लेकिन किसके द्वारा? जीसीसी द्वारा, libstdc ++ या कुछ और द्वारा?

मुझे यह पता चला: विंडोज़ के gcc पोर्ट में थ्रेड_पोज़िक्स और थ्रेड_विन 32 के बीच अंतर है?

संक्षेप में, मिंगव के इस संस्करण के लिए, थ्रेड्स-पॉज़िक्स रिलीज़ पॉज़िक्स एपीआई का उपयोग करेगा और एसटीडी :: थ्रेड का उपयोग करने की अनुमति देगा, और थ्रेड्स- win32 win32 एपीआई का उपयोग करेगा, और स्टैड को निष्क्रिय करेगा :: थ्रेड थ्रेड भाग मानक।

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


इस gcc का उपयोग करके बनाए गए एप्लिकेशन द्वारा उपयोग किया जाता है ।
देवनुल

@ देवनुल, यह एपीआई द्वारा निर्धारित नहीं है जिसे मैं उपयोग करूंगा? अगर मैं मिनगॉव के pthreads संस्करण का चयन करूंगा, तो मुझे थ्रेड के लिए WinAPI का उपयोग करने से क्या रोका जाएगा?
साइमन

gcc आपको रोकेगा, या
यूँ

जवाबों:


123

GCC एक कंपाइलर रनटाइम लाइब्रेरी (libgcc) के साथ आता है, जो इसे (अन्य चीजों के अलावा) इसके लिए उपयोग की जाने वाली भाषाओं में मल्टीथ्रेडिंग संबंधित कार्यक्षमता के लिए एक निम्न-स्तरीय OS अमूर्त प्रदान करता है। सबसे प्रासंगिक उदाहरण है libstdc ++ का C ++ 11 <thread>, <mutex>और <future>, जिसका जीसीसी अपने आंतरिक Win32 थ्रेडिंग मॉडल के साथ निर्मित होने पर पूर्ण कार्यान्वयन नहीं होता है। MinGW-w64 एक winpthreads (Win32 मल्टीथ्रेडिंग एपीआई के शीर्ष पर एक pthreads कार्यान्वयन) प्रदान करता है जो GCC तब सभी फैंसी सुविधाओं को सक्षम करने के लिए लिंक कर सकता है।

मुझे इस बात पर जोर देना चाहिए कि यह विकल्प आपको किसी भी कोड को लिखने के लिए मना नहीं करता है (यह आपके कोड में एपीआई को कॉल करने पर बिल्कुल कोई प्रभाव नहीं है )। यह केवल यह दर्शाता है कि जीसीसी की रनटाइम लाइब्रेरीज़ (libgcc / libstdc ++ / ...) उनकी कार्यक्षमता के लिए क्या उपयोग करती हैं। @ जेम्स द्वारा उद्धृत कैविटी का जीसीसी के आंतरिक थ्रेडिंग मॉडल से कोई लेना-देना नहीं है, बल्कि माइक्रोसॉफ्ट के सीआरटी कार्यान्वयन के साथ है।

संक्षेप में:

  • posix: C ++ 11 / C11 मल्टीथ्रेडिंग सुविधाओं को सक्षम करें। Libgcc, libwinpthreads पर निर्भर करता है, ताकि यदि आप सीधे pthreads API नहीं कहते हैं, तो आप winpthreads DLL वितरित करेंगे। आपके एप्लिकेशन के साथ एक और DLL वितरित करने में कुछ भी गलत नहीं है।
  • win32: नहीं C ++ 11 मल्टीथ्रेडिंग विशेषताएं।

Win32 API या pthreads API को कॉल करने वाले किसी भी उपयोगकर्ता कोड पर न तो प्रभाव पड़ता है। आप हमेशा दोनों का उपयोग कर सकते हैं।


7
आप हमेशा DLL समावेशन की आवश्यकता को हटाते हुए, gcc रनटाइम और winpthreads को सांख्यिकीय रूप से लिंक कर सकते हैं।
अलेक्जेंडर शिशेंको

3
यह मेरे लिनक्स पर इसी विकल्प खोजने के लिए कुछ समय लिया, इसलिए मामले में यह किसी और में मदद करता है: पैकेज g++-mingw-w64-x86-64दो फ़ाइलों को प्रदान करता है x86_64-w64-mingw32-g++-win32और x86_64-w64-mingw32-g++-posix, और x86_64-w64-mingw32-g++उनमें से एक को एलियास किया गया; देखते हैं update-alternatives --display x86_64-w64-mingw32-g++
दमघोंटू

हम्म, आप कहते हैं "... जिसका पूर्ण कार्यान्वयन नहीं होता है जब जीसीसी अपने आंतरिक Win32 थ्रेडिंग मॉडल के साथ बनाया जाता है .... MinGW-w64 एक winpthreads (Win32 मल्टीथ्रेडिंग एपीआई के शीर्ष पर एक pthreads कार्यान्वयन प्रदान करता है) जो GCC कर सकता है फिर सभी फैंसी सुविधाओं को सक्षम करने के लिए लिंक करें। " तो अगर मैं win32 मॉडल का चयन करता हूं, तो GCC अभी भी सभी सुविधाओं को सक्षम कर सकता है, क्योंकि यह winpthreads का उपयोग करता है? लेकिन नीचे दिए गए बुलेट में, आप "win32: No C ++ 11 मल्टीथ्रेडिंग फीचर" लिखते हैं। मुझे समझ नहीं आ रहा है। क्या "जो GCC तब लिंक कर सकता है ..." का अर्थ है कि अगर मैं win32 का चयन नहीं करता हूं, तो यह चयन कर सकता है ...?
जोहान्स शाउब -

@ जोहान्सचैब-लिट्ल खैर, नहीं। GCC के कॉन्फ्यूरी मैजिक कपल्स ने आंतरिक थ्रेड मॉडल चयन को libstdc ++ के सक्षम फीचर्स के रूप में बनाया है, जो कि GCC के आंतरिक "greadread" रैपर के ऊपर बनाया जा रहा है (जो कि सिर्फ एक पतली पॉज़िक्स जैसा थ्रेड एब्सट्रैक्शन है। C ++ 11 फीचर्स के लिए फंडामेंटल टुकड़े गायब हैं। उस परत में जब आप उपयोग करते हैं --threads=win32। इसलिए जब तक लापता बिट्स को जीसीसी में लागू नहीं किया जाता है, आपको जीसीसी को कॉन्फ़िगर करना होगा --threads=win32
rubenvb

क्या मैं -ttix का उपयोग करने वाले अन्य पुस्तकालयों के साथ -ttix का उपयोग करने वाले qt के mingw पूर्व-संकलित पुस्तकालयों का उपयोग कर सकता हूं और एक ही कार्यक्रम में दोनों पुस्तकालयों का उपयोग कर सकता हूं?
जोहान्स स्काउब -

16

GCC रनटाइम (विशेष रूप से अपवाद हैंडलिंग) के कुछ हिस्सों का उपयोग किए जा रहे थ्रेडिंग मॉडल पर निर्भर है। इसलिए, यदि आप उस रनटाइम के संस्करण का उपयोग कर रहे हैं जो POSIX थ्रेड्स के साथ बनाया गया था, लेकिन Win32 API के साथ अपने कोड में थ्रेड बनाने का निर्णय लें, तो आपको कुछ बिंदु पर समस्या होने की संभावना है।

यहां तक ​​कि अगर आप रनटाइम के Win32 थ्रेडिंग संस्करण का उपयोग कर रहे हैं, तो संभवतः आपको Win32 API को सीधे कॉल नहीं करना चाहिए। से हवाला देते हुए MinGW पूछे जाने वाले प्रश्न :

जैसा कि MinGW मानक Microsoft C रनटाइम लाइब्रेरी का उपयोग करता है जो विंडोज के साथ आता है, आपको सावधान रहना चाहिए और एक नया धागा उत्पन्न करने के लिए सही फ़ंक्शन का उपयोग करना चाहिए। विशेष रूप से, CreateThreadफ़ंक्शन सी रनटाइम लाइब्रेरी के लिए स्टैक को सही ढंग से सेटअप नहीं करेगा। आपको _beginthreadexइसके बजाय उपयोग करना चाहिए , जो (लगभग) पूरी तरह से संगत है CreateThread


7
इस मामले में, बूस्ट या क्यूटी जैसे पुस्तकालयों को फैलाने वाले तीसरे पक्ष के बारे में क्या? वहाँ किसी भी तरह से इन पुस्तकालयों mingw64 के साथ का उपयोग करने के लिए इन के लिए अंतर्निहित सूत्रण पुस्तकालय का पता लगाने के बिना है? अगर मैं मनमाने ढंग से बूस्ट का उपयोग करने का फैसला करूँ तो क्या होगा :: थ्रेड विद वेरिएंट ऑफ़ मिंगव?
तंतुनि

1
@ user460153 कुछ जानकारी qt-project.org/wiki/…
एलेक्स वी।

10
यह उत्तर गलत है। GCC रनटाइम का Win32 API पर बिल्कुल भी कोई प्रभाव नहीं है।
रुबेंवब

लिंक किए गए FAQ प्रविष्टि पढ़ें। यह उत्तर सही है।
दाइरा होपवुड

13

ध्यान दें कि अब win32 थ्रेडिंग मोड में C ++ 11 std :: थ्रेड में से कुछ का उपयोग करना संभव है। इन हेडर-ओनली एडेप्टर ने मेरे लिए बॉक्स से बाहर काम किया: https://github.com/meganz/mingw-std-threads

संशोधन इतिहास से ऐसा लग रहा है कि इसे मिंगवॉ ६४ रनटाइम का हिस्सा बनाने के लिए हाल ही में कुछ प्रयास किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.