Solução de peterson + instrução tsl
Durante muitos anos, a solução do problema de exclusão mútua não foi descoberta. O primeiro a tentar uma solução foi Dekker, solução que não foi aplicável na prática por ser complicada e dispendiosa em termos de tempo de computação.
Em 1981, Peterson descobriu uma solução bem simples, a qual é apresentada no programa a seguir:
Procedure entra_regiao(processo:interger); begin outro := vez; interessados[processo]= TRUE; vez := processo; while (vez= processo and interessado[outro]) (*espera*) do; end; procedure deixa_regiao(processo:interger); begin interessado[processo]= FALSE; end; A solução consiste em fazer com que um processo, antes de entrar na região crítica execute a rotina entra_regiao com o seu número. Ao terminar a utilização da região crítica o processo executa deixa_regiao.
É interessante estudar o funcionamento desta solução, para os diversos casos possíveis de interação entre dois processos que executam entra_regiao antes de entrar na região crítica e deixa_regiao ao sair da mesma. Como um exemplo, supõe-se que os dois processos executam as chamadas de entra_regiao praticamente ao mesmo tempo. Neste caso, ambos indicarão o seu interesse colocando a respectiva entrada do vetor interessados em TRUE. Após isto, um dos processos deixa em vez o seu valor(pois altera esta variável por último) e, portanto habilita o outro processo a continuar, aguardando até que o outro processo indique que não mais está interessado, executando deixa_regiao.
O problema desta solução, é que os próprios processos devem chamar entra_regiao e sai_regiao. Se um deles for mal programado ou trapaceiro pode monopolizar a utilização da região crítica.
Instrução TSL
Instrução especial que permite ler uma variável, armazenar seu conteúdo em uma outra área e atribuir um novo valor a esta variável(hardware). É uma instrução indivisível(executada sem interrupção), com uma variável compartilhada flag: quando flag=0, qualquer processo pode