2011-05-18 4 views
5

जैसा कि यह पहले कई बार कहा गया था, आप एक अभिनेता के अंदर एक नया धागा (actor{} ब्लॉक में एक लंबी प्रसंस्करण गणना को डाल सकते हैं), और गणना गणना उसी थ्रेड पूल पर सुरक्षित रूप से चल जाएगी (अभिनेता शेड्यूलर द्वारा उपयोग की जाने वाली))।मौजूदा थ्रेड से सुरक्षित एक नया अभिनेता बन रहा है?

actor{ 
    var i = 0 
    case msg => actor { 
     // computation 
     i = i + 1 // is `i` still thread safe? 
        // looks like it can be access simultaneosly from 2 two threads now 
        // should I make it @volatile? 
    } 
    reply(i) 
} 

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

उत्तर

8

किसी अन्य अभिनेता को एक दूसरे से पैदा करना पूरी तरह से सुरक्षित है।

हालांकि, अभिनेताओं के बीच परिवर्तनीय स्थिति साझा करना, चाहे & जहां वे पैदा हुए थे, इस पर ध्यान दिए बिना।

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

1

आपके उदाहरण में, i वास्तव में कई धागे से उपयोग किया जा सकता है; कि गणना और थ्रेड कॉलिंग जवाब कर रहे हैं। शायद आपको Future के साथ जवाब देना चाहिए?

reply(future { /* perform computation */ }) 

फोन करने वाले तो बस apply() (अवरुद्ध) वायदा इनपुट चैनल (गैर अवरुद्ध) के लिए प्रतिक्रिया करने में सक्षम होगा, या।

0

अभिनेता एक साथ एक संदेश को संसाधित कर सकते हैं, इसलिए आप अपने अभिनेता के भीतर जो कुछ भी कर रहे हैं वह थ्रेडसेफ डिज़ाइन द्वारा है जिसे आपने थ्रेड सुरक्षा के बारे में कभी नहीं सोचा है।

अभिनेताओं और इसके समवर्ती डिजाइन के पीछे यह संपूर्ण विचार है।