Проблем читалаца и писаца

У информатици, проблем читалаца и писаца је пример честог проблема у области конкурентног програмирања. Постоје бар три варијације проблема у којима велики број конкурентних нити може да приступи дељеном ресурсу у исто време. Једна група нити може да врши операцију читања, а друга операцију уписа, уз ограничење да ниједна нит не сме да врши ни читање ни упис, ако у исто време друга нит врши операцију уписа у исти дељени ресурс.

Проблем је први формулисао и решио Пи Џеј Куртоис 1971. године.[1]

Опис проблема

уреди

Постоје два типа процеса, читаоци и писци, који могу да приступају једном запису (дељеном ресурсу). Читаоци могу само да читају садржај записа, а писци могу и да га читају и да га мењају. Да не би дошло до нерегуларне ситуације у којој запису истовремено приступа више писаца или истовремено приступају и писци и читаоци, писци имају право ексклузивног приступа. Са друге стране, дозвољено је да више читалаца истовремено приступа запису.[2]

Пример решења

уреди

Пример решења применом семафора у конкурентном Паскалу, код кога је избегнуто изгладњивање, под условом да је ограничавајући семафор enter праведан:[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.

Види још

уреди

Референце

уреди
  1. ^ Taubenfeld, Gadi (2006). Synchronization Algorithms and Concurrent Programming. Pearson Education. стр. 301. 
  2. ^ Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао. стр. 46. 
  3. ^ Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао. стр. 48, 49. 

Литература

уреди
  • Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао, Београд.

Спољашње везе

уреди