मेरे पास एक सी ++ कोड है जो सीरियल पोर्ट पर एक विशेष प्रोटोकॉल को लागू करता है। कोड बहु थ्रेडेड है और आंतरिक रूप से धारावाहिक बंदरगाहों को चुनाव करता है और अपनी चक्रीय प्रसंस्करण करता है। मैं इस ड्राइवर को एरलांग से कॉल करना चाहता हूं और इस ड्राइवर से ईवेंट भी प्राप्त करना चाहता हूं। मेरी चिंता यह है कि यह सी ++ कोड बहु-थ्रेडेड है और यह भी अर्थपूर्ण है कि जब मैं ड्राइवर पर एक निश्चित कार्य कहता हूं, तो यह आंतरिक रूप से चीजों को कैश करता है जिसका उपयोग चालक की अगली कॉल पर किया जाएगा/आवश्यक होगा। मेरे प्रश्नएनआईएफ मेरे बहु थ्रेडेड सी ++ कोड को लपेटने के लिए
1. क्या एनआईएफ एक ही ओएस प्रक्रिया में चलाता है क्योंकि मेरे बाकी एरलांग प्रोसेस या एनआईएफ को एक अलग ओएस प्रक्रिया में लॉन्च किया जाता है?
2. क्या यह एनआईएफ के साथ इस बहु-थ्रेडेड स्टेटफुल सी ++ कोड को खराब करने के लिए समझ में आता है?
4. अगर एनआईएफ सही दृष्टिकोण नहीं है, तो इस सी ++ कोड के साथ एल्रैंग बात करने के लिए मेरे लिए बेहतर तरीका क्या है। मैं अपने सी ++ कोड को उसी ओएस प्रक्रिया के अंदर भी पसंद करता हूं क्योंकि मेरी बाकी एरलांग प्रक्रियाएं होती हैं और जैसा कि ऐसा लगता है कि लिंक किए गए ड्राइवरों में एक विकल्प है लेकिन यह सुनिश्चित नहीं है कि मेरे सी ++ कोड की बहु-थ्रेडेड प्रकृति ठीक रहेगी या नहीं आदर्श। इसके अलावा मैंने सुना है कि वे elrang शेड्यूलर गड़बड़ कर सकते हैं?
उत्तर के लिए धन्यवाद
यहाँ चालकों के लिए एक अच्छी शुरुआत है। बात यह है कि मैं सी ++ कोड नहीं बदल सकता और यह आंतरिक रूप से कुछ सीमित धागे बनाता है। इसके अलावा इसमें कुछ आंतरिक डेटा संरचनाओं पर ताले हैं जहां एनआईएफ कॉल का उपयोग किया जा सकता है और इसलिए एनआईएफ कॉल तब तक अवरुद्ध हो सकता है जब तक आंतरिक थ्रेड लॉक जारी नहीं करता है। क्या यह अभी भी ठीक है कि सी ++ कोड बग फ्री है? साथ ही, यह मुझे लगता है कि सभी Erlang प्रक्रिया केवल एक धागे पर चलती है (केवल मेरे पास एक कोर है) और वीएम किसी थ्रेड पूल का उपयोग नहीं करता है? क्या यह सही है? यदि ऐसा है तो हम Erlang में सहमति कैसे प्राप्त करते हैं क्योंकि हम कभी नहीं जानते कि प्रत्येक एरलांग प्रक्रिया कितनी देर तक ले सकती है? – iCode
यदि आप एसिंक व्यवहार प्राप्त करना चाहते हैं तो आप अपने बारे में बात करने के लिए http://www.erlang.org/doc/man/erl_nif.html#enif_thread_create का उपयोग करना चाहिए ताकि आप अपना सी ++ कोड निष्पादित कर सकें। आप उपयोग करते हैं एक पाइप या somesuch उस धागे के साथ संवाद करने के लिए और वापस परिणाम भेजने के लिए enif_send_term का उपयोग करें।एक ड्राइवर को कार्यान्वित करने से आप बेहतर तरीके से सूट कर सकते हैं, फिर आप सी ++ संचालन करने के लिए एर्लंग एसिंक थ्रेड पूल में निर्मित का उपयोग कर सकते हैं। एक गैर-एसएमपी एम्यूलेटर में चलने पर ड्राइवर्स भी अधिक लचीला होते हैं (एसपीपी: 1: 1 के समान नहीं)। – Lukas
एरलांग में धागे की संख्या समेकन को अधिक प्रभावित नहीं करती है। वीएम शेड्यूलर बस सभी प्रक्रियाओं के बीच CPU समय लोड करता है (उनकी प्राथमिकता के अनुसार, जो डिफ़ॉल्ट रूप से सामान्य है और जिसे आप प्रत्येक प्रक्रिया के लिए स्पष्ट रूप से सेट कर सकते हैं)। आप यहां से एर्लांग प्रक्रियाओं के बारे में एक बेहतर विचार प्राप्त कर सकते हैं: http://c2.com/cgi/wiki?GreenVsNativeThreads – demeshchuk