2012-09-18 10 views
13

मैं एक बहुप्रचारित सी ++ प्रोग्राम लिख रहा हूं और एक बहुप्रचारित सी लाइब्रेरी का उपयोग करना चाहता हूं।
यह लाइब्रेरी मुझे यह कुछ कार्यकर्ता धागे बना सकते हैं और (इस जैसे अपनी दौड़ को नियंत्रण बढ़ाने के) कोड का उपयोग कर समारोह का निवासी प्रणाली तरीकों का उपयोग करने की उम्मीद:मिक्सिंग सी ++ 11 std :: थ्रेड और सी सिस्टम थ्रेड्स (यानी pthreads)

void system_specific_thread_init(); 
#ifdef _WIN32 
    DWORD WINAPI system_specific_thread_run(LPVOID unused) 
    { 
     library_run(); 
     return 0; 
    } 

    void system_specific_thread_init() 
    { 
     Createthread(NULL, 0, system_specific_thread_run, NULL, 0, NULL); 
    } 
#else 
    void* system_specific_thread_run(void *unused) 
    { 
     library_run(); 
     return NULL; 
    } 

    void system_specific_thread_init() 
    { 
     pthread_t id; 
     pthread_create(&id, NULL, system_specific_thread_run, NULL); 
    } 
#endif 
system_specific_thread_init(); 

जिसके बाद यह प्रासंगिक देशी प्रणाली म्युटेक्स का उपयोग करेगा अन्य मूल सिस्टम धागे के तरीकों के साथ काम करने के दौरान अपने कार्यों को कॉल करने के तरीके।

हालांकि, मैं अपने सभी धागे बनाने और प्रबंधित करने के लिए सी ++ 11 <thread> लाइब्रेरी का उपयोग कर रहा हूं। मैं std::thread(library_run) के साथ कार्यकर्ता थ्रेड (ओं) बनाना चाहता हूं और अन्य ऐसे धागे से लाइब्रेरी फ़ंक्शंस को कॉल करना चाहता हूं।

क्या यह करने के लिए सुरक्षित है, या DS9K राक्षसों को मेरी नाक से उड़ने का कारण बन जाएगा?

उत्तर

3

सी ++ मानक निर्दिष्ट नहीं करता है कि सी ++ धागे किसी अन्य थ्रेड लाइब्रेरी के साथ कैसे सहभागिता करते हैं, लेकिन आम तौर पर मैं अंतर्निहित सिस्टम थ्रेड लाइब्रेरी का उपयोग करने के लिए सी ++ कार्यान्वयन की अपेक्षा करता हूं, इसलिए आपका उपयोग सुरक्षित होना चाहिए।

सिस्टम थ्रेड लाइब्रेरी लॉकिंग प्राइमेटिव्स का उपयोग करने वाली तीसरी पार्टी लाइब्रेरी का उपयोग करने में सक्षम होने के नाते यह एक सामान्य उपयोग मामला है कि इसे काम करने की उम्मीद की जानी चाहिए (अन्यथा C++ थ्रेडिंग समर्थन वास्तविक दुनिया की कई स्थितियों में लगभग बेकार होगा)। जैसे पीट बताते हैं, थ्रेड हैंडल/आईडी से जुड़ी कुछ भी अधिक मुश्किल हो सकती है (लेकिन आपके प्रश्न को पढ़ने से जरूरी नहीं होना चाहिए)।

6

सी ++ 11 धागे native_handle() नामक सदस्य फ़ंक्शन हो सकते हैं या नहीं; यह कार्यान्वयन-परिभाषित है कि यह मौजूद है या नहीं। यदि यह मौजूद है, तो यह native_handle_type प्रकार का ऑब्जेक्ट देता है; यह कार्यान्वयन-परिभाषित है कि इस प्रकार का एक वस्तु किस प्रकार उपयोग किया जा सकता है। तो अपने दस्तावेज पढ़ें।

+1

मुझे नहीं पता कि यह उत्तर प्रश्न के लिए प्रासंगिक कैसे है - यदि सी लाइब्रेरी को केवल सिस्टम म्यूटेक्स का उपयोग करने की आवश्यकता है तो देशी धागे हैंडल प्राप्त करने की आवश्यकता नहीं है। – cmeerw

+0

@Pete क्या आप कृपया अपने उत्तर पर विस्तृत जानकारी दे सकते हैं? –

+0

@LexiR - मेरी माफ़ी; @cmeerw सही है - मेरा जवाब, तकनीकी रूप से सही होने पर, वास्तव में आपके द्वारा पूछे जाने वाले पते को संबोधित नहीं करता है। आम तौर पर, म्यूटेक्स थ्रेड विवरण पर निर्भर नहीं होते हैं, इसलिए देशी म्यूटेक्स का उपयोग करना शायद ठीक है। दूसरी तरफ, यदि आप std :: mutex (std :: lock_guard के साथ) का उपयोग करते हैं तो आपको अपवाद-सुरक्षित लॉकिंग और अनलॉकिंग मिलती है, उसी वर्ण के साथ जो मैंने ऊपर वर्णित किया है, शायद सिस्टम म्यूटेक्स तक पहुंच जाए। –

2

यह वास्तव में लाइब्रेरी क्या कर रहा है इस पर निर्भर करता है। म्यूटिस के लिए pthreads का उपयोग करना और ऐसी कोई समस्या नहीं होनी चाहिए। हालांकि यदि लाइब्रेरी वास्तव में pthread_join जैसे कार्यों का उपयोग करके धागे को प्रबंधित करने का प्रयास करती है, तो इससे समस्याएं पैदा हो सकती हैं। यह अभी भी उन सिस्टम पर काम कर सकता है जहां pthread मानक (यूनिक्स और ऐसा) है, क्योंकि std::threadpthreads के आस-पास एक बहुत ही पतले आवरण के रूप में कार्यान्वित किया जा सकता है, लेकिन यह स्पष्ट रूप से बहुत ही कार्यान्वयन निर्भर होगा और कुछ ऐसा नहीं जो मैं भविष्य के संस्करणों के लिए भी काम करने पर गिनता हूं एक ही संकलक के। CreateThread के उपयोग के लिए इसी तरह के तर्क किए जा सकते हैं।

1

नया सी और सी ++ मानकों (सी 11 और सी ++ 11) दोनों धागे के समान मॉडल को लागू करते हैं और उनके इंटरफेस संगत होना चाहिए। तो जो भी मंच आपको सी ++ 11 धागे के कार्यान्वयन के साथ प्रदान करता है, वह आपको सी में भी प्रदान करने में सक्षम होना चाहिए। यदि यह नहीं है तो यह निश्चित रूप से केवल अस्थायी है।

यदि आप ऐसे प्लेटफ़ॉर्म पर हैं जो देशी धागे मॉडल (शायद एक POSIX प्लेटफ़ॉर्म) के रूप में pthread है तो C++ 11 थ्रेड लगभग निश्चित रूप से इसके शीर्ष पर बना है। लेकिन सावधान रहें, इन दो थ्रेड मॉडल के बीच कॉलिंग सम्मेलन केवल समान हैं, समान नहीं हैं। E.g थ्रेड फ़ंक्शंस का रिटर्न वैल्यू void* पाथ्रेड और int सी ++ 11/सी 11 के लिए है।

लेकिन यदि आप जल्दी में हैं, और यह इंतजार नहीं कर सकते कि आपका कंपाइलर विक्रेता सी 11 इंटरफेस भी प्रदान करता है, तो आप केवल सी ++ कार्यों के आसपास उथले इंटरफेस को लागू कर सकते हैं। ऐसा करने के लिए यह एक बड़ा सौदा नहीं होना चाहिए।

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