मैं जावा में समवर्ती प्रोग्रामिंग सीख रहा हूं, और गेम ऑफ लाइफ के लिए सिमुलेशन लिख रहा हूं।कॉनवे के जीवन के खेल के लिए मल्टीथ्रेडेड जावा प्रोग्राम - सीमा कोशिकाओं पर विवाद
यहाँ मैं क्या सोच रहा हूँ है:
- उपयोग पूर्णांक [] [] कोशिकाओं के राज्यों की दुकान
- विभाजन पूर्णांक टी खंडों में [] [] और टी कार्यकर्ता धागे का उपयोग करने के
- टी थ्रेड अपने सेगमेंट से पढ़े जाएंगे, अपने सेगमेंट में सभी सेल्स के लिए नए मानों की गणना करेंगे और कोशिकाओं को अपडेट करेंगे।
- एक बार जब वे गणना समाप्त कर लेते हैं तो वे अन्य श्रमिकों के लिए
- समाप्त करने के लिए बाधा को प्रतीक्षा करते हैं जब बाधा पार हो जाता है मुख्य थ्रेड यूआई अपडेट करेगा।
- श्रमिक अगले राज्य की गणना करने के लिए आगे बढ़ते हैं।
अब सेगमेंट की सामान्य सीमाओं पर विवाद होने जा रहा है। यदि कोई पड़ोसी अपने पड़ोसी को पिछले मूल्य को पढ़ने से पहले सीमा कक्ष की स्थिति को ओवरराइट करता है, तो पड़ोसी की गणना गलत होगी।
मेरे विकल्प क्या हैं?
- रननेबल के बजाय कॉल करने योग्य का उपयोग करें और कार्यकर्ता धागे नए मान को वापस करें (सेगमेंट को अपडेट करने के बजाय)। बाधा पार होने के बाद मुख्य धागा मैट्रिक्स को अपडेट कर सकता है। इस विकल्प में मैट्रिक्स में वर्कर थ्रेड द्वारा दिए गए परिणामों की प्रतिलिपि बनाना शामिल है।
- दो बाधाओं का उपयोग करें। मजदूर धागे सीमावर्ती कोशिकाओं की एक प्रति अपने पड़ोसियों के सेगमेंट बनाते हैं और पहले बाधा पर इंतजार करते हैं। एक बार यह बाधा पारित हो जाने के बाद, वे अगले राज्यों की गणना करने और स्थान पर सेगमेंट अपडेट करने के लिए आगे बढ़ते हैं। फिर वे दूसरी बाधा पर इंतजार करते हैं। मुख्य धागा यूआई अद्यतन करता है।
मेरे सवाल है, वहाँ सीमा कोशिकाओं पर विवाद है कि कॉपी करने डेटा को शामिल नहीं करता या कि उपरोक्त दो विकल्प और अधिक कुशल है से निपटने के लिए किसी भी अन्य तरीका है? रीडरवाइटर लॉक, अस्थिर चर या अन्य सिंक्रनाइज़िंग तंत्र का उपयोग कर सकते हैं?
अद्यतन: अब तक double buffering solution by Peter सबसे साफ है। लेकिन मेरे पास एक प्रश्न है। चूंकि दो सरणी साझा डेटा हैं और हम किसी सिंक्रनाइज़ेशन (सिंक्रनाइज़ एक्सेस या अस्थिर चर) का उपयोग नहीं कर रहे हैं, क्या यह दृश्यता समस्या नहीं बनाएगा? क्या कई सीपीयू सरणी मानों को कैश कर सकते हैं और प्रत्येक पुनरावृत्ति के साथ सरणी का केवल एक हिस्सा अपडेट कर सकते हैं? फिर थ्रेड को सीमा कोशिकाओं के लिए पुरानी मान मिल जाएगी। क्या यह संभव है? यदि नहीं, क्यों। यदि हां, तो मैं इसे कैसे हल करूं? ऐसा लगता है declaring two arrays volatile will not make their individual elements volatile।
कुछ विचार करने के लिए नियमित int –
लाभ के बजाय AtomicInt का उपयोग कर रहा है? क्या वह अधिक सिंक्रनाइज़ेशन नहीं होगा? – Helen
आपको int का उपयोग करने की आवश्यकता क्यों है, क्या यह बूलियन का उपयोग करके स्टोर करने के लिए अधिक तार्किक और कुशल नहीं होगा? – Pool