2012-07-25 21 views
9

मैं सोच रहा था कि स्मृति से पढ़ना क्यों थ्रेड-सुरक्षित नहीं है। मैंने अब तक जो देखा है, उसके अलावा this प्रश्न के साथ, स्मृति से पढ़ना थ्रेड-सुरक्षित प्रतीत नहीं होता है।थ्रेड-सुरक्षित क्यों नहीं पढ़ रहा है?

मैं थोड़ी देर के लिए पाइथन में कोडिंग कर रहा हूं और अब सी ++ में जा रहा हूं। मैंने कभी नहीं सुना है कि पायथन में पढ़ना धागा-सुरक्षित नहीं है।

अगर मैं गलत हूं, तो कृपया मुझे सही करें, लेकिन यदि नहीं, तो कृपया मुझे बताएं कि स्मृति से पढ़ना क्यों थ्रेड-सुरक्षित नहीं है।

+1

मैं पढ़ http सिफारिश करेंगे: //en.wikipedia।org/wiki/पाठकों-writers_problem –

उत्तर

15

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

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

फ्रैथन के रूप में, संभावना है कि पाइथन डेटा हमेशा भाषा रनटाइम द्वारा आपके लिए सिंक्रनाइज़ किया जाता है, यदि ऐसा नहीं है तो आपको वही धागा जल्दी या बाद में समस्याएं मिल जाएगी। (त्वरित गूगल कहता है हाँ, Python will suffer the same problems क्या आप सावधान नहीं हैं)

8

यदि थ्रेड एक ही स्थान पढ़ रहे हैं, तब तक यह थ्रेड सुरक्षित है, जब तक कोई भी वहां लिखने का प्रयास नहीं करता है।

विचार करें कि थ्रेड ए एक ही समय में कुछ पढ़ रहा है जैसे थ्रेड बी पढ़ने वाली स्मृति पर लिख रहा है। यह race condition उत्पन्न करेगा। रीडिंग परिणाम लॉन्च से

7

मेमोरी से पढ़ना थ्रेड-सुरक्षित है, स्मृति से पढ़ना एक ही समय में लिखा जा सकता है, हालांकि सुरक्षित नहीं है।

पायथन में यह एक समस्या से कम है क्योंकि बहुत सी वस्तुएं अपरिवर्तनीय हैं, इसलिए केवल उन मामलों में संदर्भ संशोधित हैं, स्मृति ही नहीं।

0

एक ही चीज़ को एक साथ पढ़ना - सुरक्षित है। समस्या तब होती है जब एक ही समय में कुछ लिखता है।

पर विचार करें निम्नलिखित कोड:

int arr_len = 3; 
int* arr = new int[arr_len]; 

void thread_1() 
{ 
    std::cout << arr[arr_len-1]; 
} 

void thread_2(int new_len) 
{ 
    int* temp = new int[new_len]; 
    for(int i = 0; i < arr_len && i < new_len; ++i) 
     temp[i] = arr[i]; 
    arr_len = new_len; 
    delete arr; 
    arr = temp; 
} 

की कि arr[arr_len] क्रमिक रूप से किया जाता है लगता है (पहले arr_len पढ़ा जाता है, और फिर arr) करते हैं।

क्या होता है जब 2 धागे interleaved चलाते हैं? तीन चीजों में से एक हो सकता है:

  • कोई समस्या नहीं - आप भाग्यशाली हैं!
  • arr_lenarr से भी बड़ा है - यूबी :(
  • arr अवैध है (नष्ट कर दिया गया) - यूबी :(