2012-02-29 14 views
11

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

तो मेरा प्रश्न सबसे पहले है, थ्रेडिंग के दो पूरी तरह से अलग स्वाद क्यों हैं? और सबसे दूसरा, वे दोनों इतने अधूरे क्यों हैं जब वे एक साथ मूल रूप से आपको जो कुछ भी चाहिए, प्रदान करते हैं?

उत्तर

8

core.thread थ्रेडिंग के लिए मूल, निम्न-स्तरीय प्राइमेटिव प्रदान करता है। std.concurrency आंतरिक रूप से core.thread का उपयोग करता है। tid केवल std.concurrency.spawn से प्राप्त किया जा सकता है।

तो मेरा प्रश्न सबसे पहले है, थ्रेडिंग के दो पूरी तरह से अलग स्वाद क्यों हैं?

आप यह भी पूछ सकते हैं कि कोड, सामान्य डी और इनलाइन असेंबली कोड लिखने के दो तरीके क्यों हैं। उच्च (एआर) स्तर और निम्न स्तर है।

और दूसरा, वे दोनों इतने अपूर्ण क्यों हैं जब वे मूल रूप से आपको जो कुछ भी चाहिए, उसे प्रदान करते हैं?

वे अधूरे नहीं हैं, लेकिन आपके मल्टीथ्रेडिंग को एक या दूसरे में काम करने के लिए डिज़ाइन किया जाना चाहिए। यदि std.concurrency ने Thread एस पर मनमाने ढंग से पहुंच की अनुमति दी है और इस तरह, गारंटी देता है कि यह इतना मजबूत नहीं हो सकता है।

अपने अधिक विशिष्ट सवालों के जवाब देने के लिए, यह एक function और नहीं एक delegate क्योंकि एक delegate एक संदर्भ सूचक है, जो उत्परिवर्तन के लिए अनुमति देता है, जो std.concurrency की मान्यताओं के कुछ टूट जाएगा लेता है लेता है। ध्यान दें कि spawnतर्क की अनुमति नहीं देता है जिसमें उत्परिवर्तनीय संकेत है, इसलिए कोई प्रतिनिधि चीज़ चौंकाने वाली नहीं होनी चाहिए।

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

+0

वैसे मैं कैसे बताऊंगा कि धागा कब समाप्त हो गया है? बस कहें कि आपके पास एक ऐसा मुख्य चीज है जो कुछ भी नहीं कर रहा है और दूसरा धागा चल रहा है। आम तौर पर मेरे पास मुख्य कॉल thread.join() होगा। मैं संदेश को गुजरने के माध्यम से वही काम कैसे करूंगा क्योंकि मुख्य डिफ़ॉल्ट धागा है और इसमें कोई बोली नहीं है, इसलिए कोई संदेश प्राप्त नहीं हो सकता है? – Floss

+0

'प्राप्त करें' या 'प्राप्त करें' का उपयोग करें। – Bernard

+2

@ फ़्लास कार्य पूरा होने पर 'रोक दिया गया' संरचना भेजता है और केवल एक प्राप्त करता है, केवल 'thisTid' आपको वर्तमान थ्रेड का टिड देगा, भले ही यह अस्तित्व में न हो (मुख्य थ्रेड और कोई थ्रेड समेत) 'Thread.start' के साथ शुरू हुआ) –

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