Проблем читалаца и писаца
У информатици, проблем читалаца и писаца је пример честог проблема у области конкурентног програмирања. Постоје бар три варијације проблема у којима велики број конкурентних нити може да приступи дељеном ресурсу у исто време. Једна група нити може да врши операцију читања, а друга операцију уписа, уз ограничење да ниједна нит не сме да врши ни читање ни упис, ако у исто време друга нит врши операцију уписа у исти дељени ресурс.
Проблем је први формулисао и решио Пи Џеј Куртоис 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.
Види још
[уреди | уреди извор]- Проблем произвођача и потрошача
- Проблем нервозних пушача
- Проблем филозофа за ручком
- Паралелно израчунавање
Референце
[уреди | уреди извор]- ^ Taubenfeld, Gadi (2006). Synchronization Algorithms and Concurrent Programming. Pearson Education. стр. 301.
- ^ Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао. стр. 46.
- ^ Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао. стр. 48, 49.
Литература
[уреди | уреди извор]- Радивојевић, Захарије; Икодиновић, Игор; Јовановић, Зоран (2018). Конкурентно и дистрибуирано програмирање (друго издање). Академска мисао, Београд.
Спољашње везе
[уреди | уреди извор]- Опис алгоритма за трећи проблем читалаца и писаца, (језик: енглески)