2009-04-01 18 views
6

वहाँ एक समारोह सीक्या सी में कार्य परमाणु बनाने का कोई तरीका है? ।

मैं एक पोर्टेबल समाधान की तलाश नहीं कर रहा हूँ में परमाणु बनाने के लिए एक रास्ता है (प्लेटफार्मों की तलाश में - विन, लिनक्स)

+0

आप एक पोर्टेबल समाधान के लिए नहीं देख रहे हैं, तो आप अपने मंच (रों) यह निर्दिष्ट करना होगा – snemarch

उत्तर

14

शायद।

यह पूरी तरह से "परमाणु" की परिभाषा पर निर्भर करता है।

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

  • एक आरटीओएस (वास्तविक समय ऑपरेटिंग सिस्टम) वातावरण में, ओएस कर्नेल आम तौर पर महत्वपूर्ण वर्गों जैसे निम्न स्तर सिंक्रनाइज़ेशन प्राइमेटिव प्रदान करता है। एक महत्वपूर्ण खंड कोड का एक ब्लॉक है जो कम से कम सभी महत्वपूर्ण वर्गों के संबंध में "अनिवार्य रूप से" व्यवहार करता है। यह आमतौर पर ओएस के अन्य सिंक्रनाइज़ेशन प्राइमेटिव के कार्यान्वयन के लिए मौलिक है।

  • बहु-कोर वातावरण में, एक निम्न स्तर वाला आदिम जिसे स्पिनलॉक कहा जाता है अक्सर उपलब्ध होता है। इसका उपयोग कोड के ब्लॉक में प्रवेश के खिलाफ सुरक्षा के लिए किया जाता है जो उसी स्पिनलॉक ऑब्जेक्ट के अन्य उपयोगकर्ताओं के संबंध में परमाणु होना चाहिए, और लॉक जारी होने तक प्रतीक्षा सीपीयू कोर को एक तंग लूप में अवरुद्ध करके संचालित करता है (इसलिए नाम)।

  • कई थ्रेडिंग वातावरण में, घटनाओं, सेमफोर, म्यूटेक्स और कतार जैसे अधिक जटिल प्राइमेटिव थ्रेडिंग फ्रेमवर्क द्वारा प्रदान किए जाते हैं। ये थ्रेड शेड्यूलर के साथ सहयोग करते हैं जैसे कि कुछ होने की प्रतीक्षा करने वाले धागे स्थिति पूरी होने तक बिल्कुल नहीं चलते हैं। इन्हें एक ही सिंक्रनाइज़ेशन ऑब्जेक्ट को साझा करने वाले अन्य धागे के संबंध में फ़ंक्शन के क्रियाओं को परमाणु बनाने के लिए उपयोग किया जा सकता है।

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

1

नहीं portably, कम से कम। कुछ सिस्टम के लिए, आप संभवतः अपने फ़ंक्शन को पूर्व-खाली करने से रोकने के लिए, मशीन इंटरप्ट्स को चालू करने जैसी चीजों को कर सकते हैं। लेकिन यह बहुत कठिन होगा, खासकर गैर-एम्बेडेड सिस्टम के लिए।

3

आप कुछ संकेत रोकने के लिए व्यवहार (जैसे SIGKILL) अपने समारोह संकेत से बाधित नहीं होगा सुनिश्चित करने के लिए, sigprocmask() का उपयोग मुखौटा और संकेत बेनकाब करने के लिए है, हालांकि कुछ संकेत अवरुद्ध नहीं किया जा सकता और चाहते हैं (जैसे SIGSEGV) अपरिभाषित है ।

विवरण के लिए man sigprocmask देखें।

1

आपको ऐसा करने के लिए प्लेटफ़ॉर्म-विशिष्ट समर्थन की आवश्यकता होगी - या तो हार्डवेयर निर्देशों के लिए विशेष कंपाइलर इंट्रिनिक्स के उपयोग के माध्यम से या ऑपरेटिंग सिस्टम समर्थन का उपयोग करके। न तो सी और न ही सी ++ मानक सिंक्रनाइज़ेशन सामग्री है।

1

परिभाषित करें कि आप 'परमाणु' से क्या मतलब रखते हैं। क्या आप इस अर्थ में 'परमाणु' का अर्थ रखते हैं कि जब आप अपना फ़ंक्शन चलाते हैं तो शेड्यूलिंग के लिए कोई अन्य प्रक्रिया या धागा नहीं चुना जाएगा?या क्या आपका मतलब है कि आपके फ़ंक्शन में संदर्भित किसी भी साझा ऑब्जेक्ट को आपके फ़ंक्शन के दौरान किसी अन्य थ्रेड द्वारा संशोधित नहीं किया जाएगा?

पूर्व के लिए, आप वास्तव में उपयोगकर्ताओं के स्थान से इसे नियंत्रित नहीं कर सकते हैं। यदि आप एकल-सीपीयू मशीन पर हैं तो आप संभवतः उच्चतम प्राथमिकता (उपयोगकर्ताओं के स्थान से) तक अपनी प्रक्रिया प्राथमिकता बढ़ाकर परमाणुता की गारंटी दे सकते हैं। लेकिन फिर भी इसकी गारंटी नहीं है क्योंकि आपका शेड्यूलिंग एल्गोरिदम अभी भी एक और प्रक्रिया को चलाने की अनुमति दे सकता है। ऐसा करने का एकमात्र विश्वसनीय तरीका ऑपरेटिंग सिस्टम से है। एकल-सीपीयू मशीन के लिए आप इंटरप्ट अक्षम कर देंगे। एक बहु-कोर मशीन के लिए आपको बस को लॉक करना होगा और अन्य सीपीयू पर चलने वाली सभी प्रक्रियाओं की प्रतीक्षा करनी होगी।

यहां प्रश्न है: आप परमाणुता की गारंटी क्यों देना चाहते हैं? सामान्य रूप से, आवश्यकता है कि केवल आपकी प्रक्रिया चल रही हो और दूसरों को नहीं, उपयोगकर्ताओं के स्थान में मौजूद नहीं होना चाहिए। यदि आप यह सुनिश्चित करना चाहते हैं कि कुछ डेटा संरचनाओं को एक समय में केवल एक थ्रेड द्वारा एक्सेस किया जाता है, तो आपको पोर्टेबल थ्रेड लाइब्रेरी (उदाहरण के लिए pthread) का उपयोग करना चाहिए, और एक महत्वपूर्ण अनुभाग के रूप में अपने फ़ंक्शन को बाड़ करना चाहिए।

1

अगर परमाणु द्वारा आपका मतलब है 'एक समय में केवल एक धागा', तो आप केवल एक महत्वपूर्ण खंड ब्लॉक (विंडोज़ में) के साथ फ़ंक्शन की रक्षा कर सकते हैं। लिनक्स में, मैं एक महत्वपूर्ण खंड का अनुकरण करने के लिए एक म्यूटेक्स लॉक/अनलॉक का उपयोग करता हूं।

0

आप शायद पॉज़िक्स सेमफोर, म्यूटेक्स या इसी तरह की तलाश करना चाहें, जो विंडोज और लिनक्स दोनों पर काम कर सकता है।

उदा। साइगविन या मिनजीडब्ल्यू लिनक्स और विंडोज के बीच पोर्टेबल कोड लिखना भी संभव है।

भी अच्छी बात आप लिनक्स पर खिड़कियों libs बना सकते हैं: http://cdtdoug.blogspot.com/2009/05/mingw-cross-for-linux.html

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