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.