volatile int s = 0; /* Variável compartilhada */
volatile int ultimo = 0, interesse[2] = {false, false};
Thread_i:
int adv = i^1; /* Id da thread adversária */
while (true)
interesse[i] = true;
ultimo = i;
while (ultimo == i && interesse[adv]) ;
s = i;
print ("Thr %d: s = %d", i, s);
interesse[i] = false;
Podemos estender esta ideia para N threads utilizando a abordagem de
campeonato entre threads vista em sala de
aula.
camp4.c.
Implemente esta abordagem escrevendo apenas uma única função
f_thread() e utilizando alocação dinâmica para as variáveis de
controle. Para teste, principalmente em máquinas com apenas um
processador, deve ser colocada uma chamada à
função sleep() nos seguintes pontos:
camp 7.
Sua implementação deve substituir o uso de espera ocupada simples por
chamadas a futex_wait.
É preciso tomar cuidado com a ordem das atribuições com valor 0 aos
vários níveis de interesse no final da função. Modifique o seu código
para fazer a atribuição na ordem errada e coloque
comandos sleep() para que com alta probabilidade a saída
contenha alguma linha na forma:
Thread 0, s = 1.
Entregar por e-mail para godoy at dca dot fee dot unicamp dot br
Enviar o(s) arquivo(s) de implementação correta e incorreta, um Makefile e um arquivo texto com uma breve descrição das decisões tomadas pelo grupo. Se o grupo utilizou alguma interface gráfica, especificar possíveis dependências de pacotes externos.