2012-04-02 17 views
5

Mam trudności ze zrozumieniem drugiego algorytmu problemu pisarzy-pisarzy. Rozumiem ogólną koncepcję, że scenarzyści zyskają pierwszeństwo przed czytelnikami (czytelnicy mogą głodować). Rozumiem nawet warunkową implementację zmiennej tego algorytmu Reader/Writer Locks in C++. Jednak implementacja mutex semafora & nie ma dla mnie sensu. To jest przykład z Wikipedii:Drugie rozwiązanie algorytmu dla czytelników-pisarza

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] 

Nie rozumiem co trzy semafory (mutex 3, R i mutex 1) są w blokady czytnika. Czy nie wystarczy jeden semafor na czytanie?

+0

Czy mógłbyś zamieścić link do algorytmu lub strony Wikipedii, aby upewnić się, że wszyscy patrzymy na to samo? – gbulmer

Odpowiedz

8

chroni zmienną readcount; mutext 2 chroni zmienną writecount; mutex r chroni operacje odczytu i mutext w chroni operacje zapisu.

1) Załóżmy, że pisarz jest w:

Sygnałów mutex 2 i przyrostach writercount aby uwzględnić dodatkową pisarz (sam) ponieważ jest to jedyny proces, który może zmienić writercount (jak to trzyma mutex 2) może bezpiecznie przetestować, czy jest to jedyny program piszący (writercount==1), jeśli jest prawdziwy, sygnalizuje mutex r, aby chronić czytelników przed nadejściem - inni autorzy (writercount > 1) mogą cieszyć się już sygnalizowanym muteksem r.

Pisarz sygnalizuje następnie mutex w, aby chronić swoje zmiany przed innymi (współbieżnymi) pisarzami.

Ostatni autor (writecount==1) wydaje mutex r, aby umożliwić czytelnikom wykonywanie ich zadań.

2) Załóżmy, że czytelnik jest w:

Sygnałów mutex 3 chroniących logikę Setup czytelników z innych czytelników; następnie sygnalizuje mutex r w celu ochrony przed innymi pisarzami (pamiętaj, r jest sygnalizowane podczas działania pisarzy); następnie sygnały mutex 1, aby chronić readcount (od innych czytników, które mogą wychodzić) i jeśli jest to pierwszy czytnik (readercount == 1), sygnalizuje mutex w w celu ochrony przed pisarzami (obecnie wyłącza pisarzy od wykonywania ich operacji).

Reading można zrobić równolegle, więc nie ochrona jest potrzebna z innymi czytelnikami podczas czytania (pamiętaj, mutex w odbywa się w tym momencie, więc nie intereference z pisarzami)

Wtedy ostatni czytelnik resetuje zapisu muteksu (w), aby umożliwić pisarzom.


Sztuką, która zapobiega pisarz głodu jest, że twórcy stwarzać jak czytniki (gdy sygnalizacja muteksu p), więc mają duże szanse na uzyskanie zaplanowano nawet gdy istnieje wielu czytelników. Ponadto, mutex 3 uniemożliwia zbyt wielu czytelnikom oczekiwanie na mutex r, więc scenarzyści mają dużą szansę na zgłoszenie r, gdy nadejdą.

+0

Dzięki za wyjaśnienie Attila. Część do zapisu ma sens, ale część do czytania jest dla mnie nadal niejasna. Być może aby to lepiej zrozumieć, mógłbyś wyjaśnić, co by się stało, gdyby nie było semaforów mutex 3 i mutex 1 (tylko semafor pozostaje w celu ochrony readcount)? – ayl

+3

Readcount jest chroniony przez 'mutex 1'. 'mutex 3' służy do ograniczenia liczby jednoczesnych czytników oczekujących na' r' na 1 (aby zapobiec głodowaniu pisarzy). 'r' służy do koordynowania dostępu między czytnikami i pisarzami – Attila

+1

mutex 3 jest częścią najbardziej utajoną. Ale dobrze wyjaśnione! – Garfield

Powiązane problemy