2012-04-02 13 views
5

मुझे पाठकों-लेखकों की समस्या के लिए दूसरा एल्गोरिदम समझने में वास्तव में कठिन समय है। मैं सामान्य अवधारणा को समझता हूं, कि लेखकों को पाठकों पर प्राथमिकता मिलेगी (पाठक भूखा हो सकते हैं)। मैं इस एल्गोरिदम Reader/Writer Locks in C++ के सशर्त चर कार्यान्वयन को भी समझता हूं। हालांकि, semaphore & mutex कार्यान्वयन मुझे कोई समझ नहीं आता है।पाठकों के लिए दूसरा एल्गोरिदम समाधान-लेखक

int readcount, writecount; (initial value = 0) 
semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1) 

READER 
    P(mutex 3); 
    P(r); 
     P(mutex 1); 
     readcount := readcount + 1; 
     if readcount = 1 then P(w); 
     V(mutex 1); 
    V(r); 
    V(mutex 3); 

    reading is done 

    P(mutex 1); 
    readcount := readcount - 1; 
    if readcount = 0 then V(w); 
    V(mutex 1); 


WRITER 
    P(mutex 2); 
     writecount := writecount + 1; 
     if writecount = 1 then P(r); 
    V(mutex 2); 

    P(w); 
    writing is performed 
    V(w); 

    P(mutex 2); 
    writecount := writecount - 1; 
    if writecount = 0 then V(r); 
    V(mutex 2); 

[http://en.wikipedia.org/wiki/Readers-writers_problem][2] 

मुझे समझ नहीं आता क्या तीन सेमाफोर (म्युटेक्स 3, आर, और म्युटेक्स 1) पाठक ताला में लिए कर रहे हैं: यह विकिपीडिया से एक उदाहरण है। क्या रीडकाउंट के लिए पर्याप्त सेमफोर नहीं है?

+0

क्या आप यह सुनिश्चित करने के लिए एल्गोरिदम या विकिपीडिया पेज पर एक लिंक पोस्ट करेंगे, हम सभी एक ही चीज़ को देख रहे हैं? – gbulmer

उत्तर

8

mutex 1readcount चर की सुरक्षा करता है; mutext 2writecount चर की रक्षा करता है; mutex r रीडिंग ऑपरेशंस की रक्षा करता है और mutext w लेखन कार्यों की सुरक्षा करता है। , अतिरिक्त लेखक (ही) चूंकि यह केवल प्रक्रिया है कि writercount बदल सकते हैं के लिए खाते

सिग्नल mutex 2 और वेतन वृद्धि writercount (के रूप में यह mutex 2 कर रहा है):

1) के एक लेखक में आता है लगता है चलो यह सुरक्षित रूप से परीक्षण कर सकता है कि यह एकमात्र लेखक (writercount==1) है, यदि सही है, तो यह पाठकों को अन्य लेखकों (writercount > 1) में आने से बचाने के लिए mutex r संकेत करता है) mutex r का पहले से संकेत किया जा सकता है।

लेखक फिर अन्य (समवर्ती) लेखकों से अपने परिवर्तनों की रक्षा के लिए mutex w संकेत करता है।

अंतिम लेखक (writecount==1) पाठकों को अपने कार्यों को करने के लिए mutex r जारी करता है।

2) चलो मान लीजिए एक पाठक में आती है:

सिग्नल mutex 3 अन्य पाठकों से पाठकों की स्थापना के तर्क की रक्षा के लिए; फिर अन्य लेखकों से बचाने के लिए mutex r संकेत (याद रखें, r संकेतक हैं जबकि लेखकों का संचालन हो रहा है); फिर रीडकाउंट (अन्य पाठकों से बाहर निकलने वाले) से बचाने के लिए mutex 1 सिग्नल करें और यदि यह पहला पाठक (readercount == 1) है, तो लेखकों से बचाने के लिए mutex w सिग्नल (अब लेखकों को उनके परिचालन करने से बाहर कर दिया गया है)।

पढ़ना समानांतर किया जा सकता है, तो कोई सुरक्षा नहीं अन्य पाठकों से की जरूरत है (याद रखें, म्युटेक्स w इस बिंदु पर आयोजित किया जा रहा है, लेखकों से इसलिए कोई intereference), जबकि पढ़ने

तो पिछले पाठक लिखने म्युटेक्स रीसेट करता है (w) लेखकों को अनुमति देने के लिए।


चाल कि लेखक भुखमरी से बचाता है कि लेखकों को पाठकों के रूप में खड़ा है (जब म्युटेक्स p संकेत), इसलिए अनुसूचित हो रही है, भले ही कई पाठकों का एक अच्छा मौका है। इसके अलावा, mutex 3 म्यूटेक्स r पर प्रतीक्षा करने से बहुत से पाठकों को रोकता है, इसलिए लेखकों के पास आने पर r सिग्नल करने का एक अच्छा मौका होता है।

+0

स्पष्टीकरण Attila के लिए धन्यवाद। लेखन भाग सही समझ में आता है, लेकिन पढ़ा हुआ हिस्सा अभी भी मेरे लिए अस्पष्ट है। शायद यह बेहतर समझने के लिए आप यह बता सकते हैं कि क्या होगा यदि कोई म्यूटेक्स 3 और म्यूटेक्स 1 सेमफोर नहीं था (केवल आर सेमफोर रीडकाउंट की रक्षा के लिए रहता है)? – ayl

+3

रीडकाउंट 'mutex 1' द्वारा संरक्षित है। 'mutex 3' का उपयोग 'आर' से 1 (लेखक भुखमरी को रोकने के लिए) पर आने वाले समवर्ती पाठकों की संख्या को सीमित करने के लिए किया जाता है। पाठकों और लेखकों के बीच पहुंच समन्वय करने के लिए 'आर' का उपयोग किया जाता है – Attila

+1

म्यूटेक्स 3 सबसे कठिन हिस्सा है। लेकिन अच्छी तरह से समझाया! – Garfield

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