समवर्ती हास्केल

समवर्ती हास्केल का विस्तार होता है स्पष्ट संगामिति (कंप्यूटर विज्ञान) के साथ हास्केल 98। इसकी दो मुख्य अंतर्निहित अवधारणाएँ हैं:


 * एक आदिम प्रकार  एक बाउंडेड/सिंगल-प्लेस एक्टर मॉडल और प्रोसेस कैलकुली # एसिंक्रोनस चैनल को लागू करना, जो या तो खाली है या टाइप का मान रखता है.
 * के माध्यम से एक समवर्ती थ्रेड (कंप्यूटिंग) उत्पन्न करने की क्षमता  प्राचीन।

इसके ऊपर निर्मित उपयोगी संगामिति और तुल्यकालन सार का एक संग्रह है जैसे कि अभिनेता मॉडल और प्रक्रिया गणना # अतुल्यकालिक चैनल, सेमाफोर (प्रोग्रामिंग) और नमूना चर।

हास्केल थ्रेड्स में बहुत कम ओवरहेड होता है: हास्केल रनटाइम के लिए निर्माण, संदर्भ-स्विचिंग और शेड्यूलिंग सभी आंतरिक हैं। ये हास्केल-स्तरीय धागे ओएस-स्तरीय धागे की कॉन्फ़िगर करने योग्य संख्या पर मैप किए जाते हैं, आमतौर पर प्रति प्रोसेसर कोर में से एक।

सॉफ्टवेयर लेनदेन स्मृति
सॉफ्टवेयर ट्रांजैक्शनल मेमोरी (एसटीएम) एक्सटेंशन ग्लासगो के ग्लासगो हास्केल कंपाइलर समवर्ती हास्केल के फोर्किंग प्रिमिटिव की प्रक्रिया का पुन: उपयोग करता है। एसटीएम हालांकि:


 * टालता है एस के पक्ष में  एस।
 * परिचय देता है  और   प्रिमिटिव, वैकल्पिक परमाणु क्रियाओं को सॉफ्टवेयर ट्रांजैक्शनल मेमोरी # कंपोज़ेबल ऑपरेशंस एक साथ करने की अनुमति देता है।

एसटीएम मोनाड
एसटीएम मोनाड (कार्यात्मक प्रोग्रामिंग) हास्केल में सॉफ्टवेयर ट्रांजैक्शनल मेमोरी का कार्यान्वयन है। यह जीएचसी में लागू किया गया है, और डाटाबेस लेनदेन में परिवर्तनीय चर को संशोधित करने की अनुमति देता है।

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

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

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

यहां ही  फ़ंक्शन का उपयोग किया गया है, जो एक लेन-देन वापस करेगा और इसे फिर से प्रयास करेगा। एसटीएम में पुन: प्रयास करना स्मार्ट है क्योंकि यह लेन-देन को फिर से चलाने की कोशिश नहीं करेगा जब तक कि लेन-देन के दौरान संदर्भित चरों में से एक को किसी अन्य लेनदेन कोड द्वारा संशोधित नहीं किया गया हो। यह एसटीएम मोनड को काफी कुशल बनाता है।

ट्रांसफर फ़ंक्शन का उपयोग करने वाला एक उदाहरण प्रोग्राम इस तरह दिख सकता है:

जिसे बॉब का बैलेंस: 8000, जिल का बैलेंस: 6000 प्रिंट करना चाहिए। यहां ही  फ़ंक्शन का उपयोग IO मोनाड में STM क्रियाओं को चलाने के लिए किया गया है।