M
garante que somente um processo estará alterando
e verificando a variável rc
ao mesmo tempo.
Se não tivéssemos M
, imagine só se tivéssemos um processo
leitor e ele fosse interrompido depois de executar rc--
e fazer o valor de rc
ser 0.
Nisso entra um outro leitor e faz rc++
.
O valor de rc
agora seria 1.
Ele testa (rc==1(
e faz P(W)
pois não foi feito
V(W)
pelo outro processo leitor.
Volta então o processo anterior, testa (rc==0)
o que não é
verdade logo ele não executa V(W)
.
Temos então W=0, R=0
, um processo bloqueado em P(W)
e qualquer outro processo que entrasse ficaria bloqueado também em P(R)
.
receive_any (lista pids) { cria um pipe pipe para cada pid de lista de pids { if ((ret = fork()) != 0) { receive (pid, &msg); //processo filho write(pipe, &msg); exit(); } } read(pipe, &msg); // fica bloqueado enquanto // nao tiver mensagem no pipe mata todos os processos filho return msg; }
obs: A variação de respostas aceitáveis quanto a formas de negar essas condições era bastante grande!