गैर-कार्यात्मक भाषाओं में लगातार डेटा संरचनाओं का उपयोग


17

लगातार डेटा संरचनाओं से विशुद्ध रूप से कार्यात्मक या निकट-विशुद्ध रूप से कार्यात्मक लाभ वाली भाषाएँ क्योंकि वे अपरिवर्तनीय हैं और कार्यात्मक प्रोग्रामिंग की स्टेटलेस शैली के साथ अच्छी तरह से फिट हैं।

लेकिन समय-समय पर हम जावा जैसी भाषाओं (राज्य-आधारित, ओओपी) के लिए लगातार डेटा संरचनाओं के पुस्तकालयों को देखते हैं। लगातार डेटा संरचनाओं के पक्ष में एक दावा अक्सर सुना जाता है क्योंकि वे अपरिवर्तनीय हैं, वे थ्रेड-सुरक्षित हैं

हालाँकि, लगातार डेटा स्ट्रक्चर्स थ्रेड-सुरक्षित होने का कारण यह है कि यदि एक थ्रेड किसी कंटेंट को एक सस्टेनेबल कलेक्शन में "एड" करता है, तो ऑपरेशन एक नया कलेक्शन देता है जैसे ओरिजिनल लेकिन एलिमेंट जोड़ा गया। अन्य सूत्र इसलिए मूल संग्रह देखते हैं। दो संग्रह, आंतरिक स्थिति का एक बहुत साझा करते हैं, निश्चित रूप से - यही कारण है कि ये लगातार संरचनाएं कुशल हैं।

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

फिर भी, पीडीएस की अपरिहार्यता को "थ्रेड सुरक्षा" के लिए कुछ फायदेमंद माना जाता है? क्या कोई वास्तविक उदाहरण हैं जहां PDS सिंक्रनाइज़ेशन में मदद करता है, या संगामिति समस्याओं को हल करता है? या पीडीएस बस एक कार्यात्मक प्रोग्रामिंग शैली के समर्थन में किसी वस्तु को एक स्टेटलेस इंटरफ़ेस प्रदान करने का एक तरीका है?


3
आप "लगातार" कहते रहते हैं। क्या आप वास्तव में "लगातार" का मतलब "कार्यक्रम को फिर से जीवित करने में सक्षम" के रूप में, या सिर्फ "अपरिवर्तनीय" के रूप में "इसके निर्माण के बाद कभी नहीं बदलते"?
किलियन फोथ

17
@KilianFoth लगातार डेटा संरचनाओं की एक अच्छी तरह से स्थापित परिभाषा है : "एक निरंतर डेटा संरचना एक डेटा संरचना है जो हमेशा संशोधित होने पर खुद के पिछले संस्करण को संरक्षित करती है"। इसलिए यह पिछली संरचना को फिर से उपयोग करने के बारे में है जब इस पर आधारित एक नया ढांचा दृढ़ता के बजाय "एक कार्यक्रम के पुनरारंभ को जीवित करने में सक्षम" के रूप में बनाया जाता है।
मिशैल कोस्मुलस्की ने

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

मेरी गलती। मुझे नहीं पता था कि "लगातार डेटा संरचना" एक तकनीकी शब्द है जो मात्र दृढ़ता से अलग है।
किलियन फोथ

@delnan हाँ यह सही है।
रे तोल

जवाबों:


15

लगातार / अपरिवर्तनीय डेटा संरचनाएं अपने दम पर संगामिति समस्याओं को हल नहीं करती हैं, लेकिन वे उन्हें हल करना बहुत आसान बनाती हैं।

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

एक समाधान टी 1 और टी 2 के संचार में किसी प्रकार का अनुबंध जोड़ना है ताकि केवल एक धागे को एस को संशोधित करने की अनुमति दी जाए। यह त्रुटि प्रवण है और डिजाइन और कार्यान्वयन दोनों पर बोझ डालता है।

एक अन्य समाधान यह है कि T1 या T2 डेटा संरचना (या दोनों का क्लोन, यदि वे समन्वित नहीं हैं)। हालाँकि, यदि S लगातार नहीं है, तो यह एक महंगा O (n) है ऑपरेशन है।

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

इन्हें भी देखें: लगातार बनाम अपरिवर्तनीय डेटा संरचना


2
आह, तो इस संदर्भ में "थ्रेड सेफ्टी" का मतलब सिर्फ यह है कि एक थ्रेड को उनके द्वारा देखे गए डेटा को नष्ट करने वाले अन्य थ्रेड्स के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन सिंक्रनाइज़ेशन से कोई लेना-देना नहीं है और उन डेटा से निपटना चाहते हैं जो हम थ्रेड्स के बीच साझा करना चाहते हैं । जो मैंने सोचा था, उसके अनुरूप है, लेकिन सुरुचिपूर्ण ढंग से बताते हुए +1 "अपने दम पर शंकुधारी समस्याओं को हल नहीं करते हैं।"
रे तोल

2
@RayToal हां, इस संदर्भ में "थ्रेड सेफ" का अर्थ बिल्कुल यही है। थ्रेड्स के बीच डेटा कैसे साझा किया जाता है यह एक अलग समस्या है, जिसके कई समाधान हैं, जैसा कि आपने उल्लेख किया है (व्यक्तिगत रूप से मुझे इसकी रचना के लिए एसटीएम पसंद है)। थ्रेड सुरक्षा सुनिश्चित करता है कि आपको साझा किए जाने के बाद डेटा के साथ क्या होता है, यह चिंता करने की ज़रूरत नहीं है। यह वास्तव में एक बड़ी बात है, क्योंकि थ्रेड्स को यह सिंक्रनाइज़ करने की आवश्यकता नहीं है कि कौन डेटा संरचना पर काम करता है और कब।
पेट्र पुडलक

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

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

@RayToal एक दिलचस्प लिंक, धन्यवाद। मैंने केवल अभिनेताओं को एक उदाहरण के रूप में इस्तेमाल किया, यह नहीं कि मैं कह रहा हूं कि यह सबसे अच्छा समाधान होगा। मैंने क्लोजर का उपयोग नहीं किया है, लेकिन ऐसा लगता है कि यह पसंदीदा समाधान एसटीएम है, जिसे मैं निश्चित रूप से अभिनेताओं पर पसंद करूंगा। एसटीएम भी दृढ़ता / अपरिवर्तनीयता पर निर्भर करता है - यदि यह डेटा संरचना को अपरिवर्तनीय रूप से संशोधित करता है तो लेनदेन को फिर से शुरू करना संभव नहीं होगा।
पेट्र पुडलक

5

फिर भी, पीडीएस की अपरिहार्यता को "थ्रेड सुरक्षा" के लिए कुछ फायदेमंद माना जाता है? क्या कोई वास्तविक उदाहरण हैं जहां PDS सिंक्रनाइज़ेशन में मदद करता है, या संगामिति समस्याओं को हल करता है?

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


2

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

इतनी लंबी कहानी संक्षेप में, अपरिवर्तनीयता के बिना (भाषा या सम्मेलन द्वारा लागू), दृढ़ता ओड डेटा संरचनाएं इसके कुछ लाभ (थ्रेड सेफ्टी) खो देती हैं, लेकिन अन्य नहीं (कुछ परिदृश्यों के लिए अंतरिक्ष दक्षता)।

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

डेटा संरचनाओं की अपरिवर्तनीयता थ्रेड सुरक्षा के लिए प्रासंगिक हिस्सा है। उनकी दृढ़ता (मौजूदा संरचना का फिर से उपयोग जब एक नई संरचना बनाई जाती है) ऐसे संग्रह के साथ काम करते समय दक्षता के लिए प्रासंगिक है। चूंकि वे अपरिवर्तनीय हैं, इसलिए आइटम जोड़ने जैसा एक ऑपरेशन मौजूदा संरचना को संशोधित नहीं करता है, लेकिन अतिरिक्त तत्व के साथ एक नया रिटर्न देता है। यदि हर बार पूरी संरचना की प्रतिलिपि बनाई गई थी, तो एक खाली संग्रह के साथ शुरू करना और 1000-तत्व संग्रह के साथ समाप्त करने के लिए एक-एक करके 1000 तत्वों को जोड़ना, 0 + 1 + 2 + ... + 999 = के साथ अस्थायी ऑब्जेक्ट बनाना होगा कुल 500000 तत्व जो एक बहुत बड़ा कचरा होगा। लगातार डेटा संरचनाओं के साथ, इससे बचा जा सकता है क्योंकि 1-तत्व संग्रह को 2-तत्व एक में फिर से उपयोग किया जाता है, जिसे 3-तत्व एक में और फिर से उपयोग किया जाता है,


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

0

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

इस सरलीकृत C ++ का उदाहरण लें (वहाँ किसी भी छवि प्रसंस्करण विशेषज्ञों के सामने खुद को शर्मिंदा करने से बचने के लिए सादगी के लिए अनुकूलित नहीं किया गया है):

// Inputs an image and outputs a new one with the specified size.
Image resized_image(const Image& src, int new_w, int new_h)
{
     Image dst(new_w, new_h);
     for (int y=0; y < new_h; ++y)
     {
         for (int x=0; x < new_w; ++x)
              dst[y][x] = src.sample(x / (float)new_w, y / (float)new_h);
     }
     return dst;
}

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

मुझे Imageउपर्युक्त संदर्भ में अपरिवर्तनीय बनाकर, प्राप्त करने के लिए बहुत कम देखा जा सकता है, और संभवतः खो जाने के लिए, संभवतः, उपरोक्त फ़ंक्शन को लागू करने के लिए और अधिक सटीक बनाने के लिए, और संभवतः थोड़ा कम कुशल को छोड़कर।

पवित्रता

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

हेफ्टी स्ट्रक्चर्स की सस्ती नकल

दूसरी सबसे उपयोगी संपत्ति जो मुझे मिली है वह यह है कि सस्ते में वास्तव में भारी डेटा संरचनाओं की नकल करने की क्षमता है जब ऐसा करने की लागत, जैसा कि अक्सर उनके सख्त इनपुट / आउटपुट प्रकृति को देखते हुए कार्यों को शुद्ध बनाने के लिए खर्च किया जाएगा, गैर-तुच्छ होगा। ये छोटे ढांचे नहीं होंगे जो स्टैक पर फिट हो सकते हैं। वे Sceneएक वीडियो गेम के लिए पूरी तरह से बड़े, भारी ढांचे होंगे ।

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

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

अचल स्थिति

अंत में वहाँ अपरिवर्तनीयता है जिसे मैं इन तीनों में से सबसे कम दिलचस्प मानता हूं, लेकिन इसे लागू कर सकते हैं, एक लोहे की मुट्ठी के साथ, जब कुछ ऑब्जेक्ट डिज़ाइन का उपयोग स्थानीय अस्थायी के रूप में एक शुद्ध कार्य के लिए नहीं किया जाता है, और इसके बजाय एक व्यापक संदर्भ में, एक मूल्यवान "ऑब्जेक्ट-लेवल शुद्धता" की तरह, सभी तरीकों में अब बाहरी साइड इफेक्ट्स नहीं होते हैं (अब विधि के तत्काल स्थानीय दायरे के बाहर सदस्य परिवर्तनशील नहीं होते हैं)।

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

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

आखिरकार:

[...] ऐसा प्रतीत होता है कि लगातार डेटा संरचनाएं परिदृश्यों को संभालने के लिए पर्याप्त रूप से अपने आप में नहीं होती हैं जहां एक धागा एक ऐसा बदलाव करता है जो अन्य थ्रेड्स को दिखाई देता है। इसके लिए, ऐसा लगता है कि हमें परमाणुओं, संदर्भों, सॉफ्टवेयर लेनदेन स्मृति, या यहां तक ​​कि क्लासिक ताले और सिंक्रनाइज़ेशन तंत्र जैसे उपकरणों का उपयोग करना चाहिए।

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

लेकिन मैंने पाया है, एक बार जब आप उस तरह की नकल करने की क्षमता और आंशिक रूप से संशोधित मोटी गंदगी के संस्करणों को आउटपुट करने की क्षमता प्राप्त करते हैं, जैसा कि आप एक उदाहरण के रूप में लगातार डेटा संरचनाओं के साथ प्राप्त करेंगे, तो यह अक्सर बहुत सारे दरवाजे और अवसरों को खोल देता है जो आप कर सकते हैं। कोड को समानांतर करने से पहले इस बारे में नहीं सोचा है कि समानांतर पाइपलाइन के सख्त I / O प्रकार में एक दूसरे से पूरी तरह से स्वतंत्र रूप से चल सकते हैं। भले ही एल्गोरिथ्म के कुछ हिस्सों को प्रकृति में धारावाहिक होना पड़ता है, आप उस प्रसंस्करण को एक ही धागे में बदल सकते हैं, लेकिन पाते हैं कि इन अवधारणाओं पर झुकाव ने आसानी से दरवाजे खोल दिए हैं, और चिंता के बिना, 90% विषम काम को समानांतर करते हैं, जैसे।

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