barbeiro dorminhoco com troca de mensagens

problema do barbeiro visto em SO, mas com canais

solucao porca (nossa) chan bar_in(int), cli_in(int), cli_out(int), bar_out(int);

process Barber {
    int receba = 0;
    while (receba != EOS) {
        receive bar_in(receba);
        send cli_in(receba)
        corta()
        send bar_out(receba)
        receive cli_out(receba)
    }
}

process Clients \[i=1 to N\] {
    while(true) {
        int liberado, acabou;
        send bar_in(i);
        receive cli_in(liberado);
        if (liberado != i)
            send cli_in(liberado);
        receive bar_out(acabou);
        send cli_out(acabou);
    }
}

solução Aleardo

chan req(int), talk(int), cli[N](int)

process Barber {
    int who, val;
    while (who != EOS) {
        receive req(who);
        send cli[who](1);
        receive talk(val);
        corta();
        send cli[who](2);
        receive talk(val);
    }
}

process Clients [i=1 to N] {
    int val;
    while(true) {
        send req(i);
        receive cli[i](val);
        send talk(val);
        receive cli[i](val);
        send talk(val);
    }
}

talk pode ser unico pois o cliente so acessa aquela regiao quando cli[i] for ativado. receive talk no barbeiro nao pode ser trocado por um send cli[i]() pois ele mesmo poderia ouvir a mensagem. receive é sempre bloqueante, ele espera chegar uma mensagem até chegar algo


produtor consumidor (sincrono)

chan produto(int);

process Consumer {
    int prod;
    while (true) {
        receive produto(prod);
        receive produto(prod);
        consome(prod);
    }
}
process Producer {
    int fez;
    while (true) {
        sync_send produto();
            produz();
        sync_send produto();
    }
}

// pode ser ao contrario (sync_send vira receive).

produtor consumidor (assincrono)

chan vazio(int), cheio(int);

process prod {
    int val;
    while (true) {
        receive vazio(val);
            produz();
        send cheio(val);
    }
}

process cons {
    int val;
    while (true) {
        receive cheio(val);
            consome();
        send vazio(val);
    }
}