मैं डी के लिए नया हूं और मैं अभ्यास के लिए एक साधारण बहुप्रचारित सर्वर लिख रहा हूं। सी में क्लाइंट हैंडलर थ्रेड्स शुरू करने के लिए एक सामान्य प्रतिमान pthread_create() में नए स्वीकार्य() एड सॉकेट के फ़ाइल डिस्क्रिप्टर को पास करना है, लेकिन डी की std.concurrency.spawn() मुझे सॉकेट पास करने की अनुमति नहीं देगी क्योंकि यह उत्परिवर्तनीय है और दो धागे से सुलभ।उत्परिवर्तनीय थ्रेड-स्थानीय डेटा के लिए उपनाम
बेशक, मैं वास्तव में एक अपरिवर्तनीय सॉकेट नहीं चाहता हूं (यही कारण है कि मैं इसे मुख्य धागे में नहीं डालना चाहता हूं जब तक कि मुझे नहीं करना चाहिए) - मैं एक उत्परिवर्तनीय को पास करना चाहता हूं और इसे प्राप्त करना चाहता हूं मुख्य धागे में गुंजाइश से बाहर जाओ। मैं इसे किस तरह लूं? धागे को सॉकेट का उपयोग करने के लिए (/ can) मैं tid.send(s)
का उपयोग करना चाहिए? किसी कारण से जो मेरे लिए बहुत गुस्सा लगता है।
मेरे अब कोड:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
कौन सा पैदा करता है: त्रुटि: स्थिर ज़ोर "परिवर्तनशील धागे की स्थानीय डेटा को उपनाम अनुमति नहीं है।" ... यहां से तत्काल: स्पॉन! (सॉकेट)
पूरी तरह से काम किया, और अतिरिक्त जानकारी के लिए धन्यवाद! क्या यह ऐसा कुछ करने का बेवकूफ तरीका है, या क्या कोई बेहतर तरीका है? डी में कास्टिंग निश्चित रूप से महसूस करता है जैसे मैं कुछ गलत कर रहा हूं (यानी सी के विपरीत)। – Dan
@Dan पिछली बार मैंने चेक किया (एक साल पहले) 'साझा' के अर्थशास्त्र जहां अच्छी तरह से परिभाषित नहीं किया गया था, मुझे नहीं पता कि तब से –
उसमें से कुछ भी नहीं बदला गया है। लेकिन पूरा डी समुदाय 'साझा' के लिए अच्छी तरह परिभाषित होने का इंतजार कर रहा है। – DejanLekic