Pređi na sadržaj

Problem čitalaca i pisaca

S Vikipedije, slobodne enciklopedije

U informatici, problem čitalaca i pisaca je primer čestog problema u oblasti konkurentnog programiranja. Postoje bar tri varijacije problema u kojima veliki broj konkurentnih niti može da pristupi deljenom resursu u isto vreme. Jedna grupa niti može da vrši operaciju čitanja, a druga operaciju upisa, uz ograničenje da nijedna nit ne sme da vrši ni čitanje ni upis, ako u isto vreme druga nit vrši operaciju upisa u isti deljeni resurs.

Problem je prvi formulisao i rešio Pi Džej Kurtois 1971. godine.[1]

Opis problema[uredi | uredi izvor]

Postoje dva tipa procesa, čitaoci i pisci, koji mogu da pristupaju jednom zapisu (deljenom resursu). Čitaoci mogu samo da čitaju sadržaj zapisa, a pisci mogu i da ga čitaju i da ga menjaju. Da ne bi došlo do neregularne situacije u kojoj zapisu istovremeno pristupa više pisaca ili istovremeno pristupaju i pisci i čitaoci, pisci imaju pravo ekskluzivnog pristupa. Sa druge strane, dozvoljeno je da više čitalaca istovremeno pristupa zapisu.[2]

Primer rešenja[uredi | uredi izvor]

Primer rešenja primenom semafora u konkurentnom Paskalu, kod koga je izbegnuto izgladnjivanje, pod uslovom da je ograničavajući semafor enter pravedan:[3]

program ReadersWriters;
const Nreaders = ... //broj citalaca
      Nwriters = ... //broj pisaca

var rw, mutexR, enter : semaphore;
    nr : shared integer;

procedure Reader(i : 0..Nreaders-1);
begin
    while (true) do begin
        //...
        wait(enter);
        wait(mutexR);
        nr := nr+1;
        if (nr = 1) then wait(rw);
        signal(mutexR);
        signal(enter);
        //procitaj zapis
        wait(mutexR);
        nr := nr-1;
        if (nr = 0) then signal(rw);
        signal(mutexR);
        //...
    end
end;

procedure Writer(i : 0..Nwiters-1);
begin
    while (true) do begin
        //...
        wait(enter);
        wait(rw);
        signal(enter);
        //upisi nesto u zapis
        signal(rw);
        //...
    end
end;

begin
    init(rw, 1);
    init(mutexR, 1);
    init(enter, 1);
    nr := 0;
    cobegin
        Reader(0);
        //...
        Reader(Nreaders-1);
        Writer(0);
        //...
        Writer(Nwriter-1);
    coend
end.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Taubenfeld, Gadi (2006). Synchronization Algorithms and Concurrent Programming. Pearson Education. str. 301. 
  2. ^ Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao. str. 46. 
  3. ^ Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao. str. 48, 49. 

Literatura[uredi | uredi izvor]

  • Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao, Beograd.

Spoljašnje veze[uredi | uredi izvor]