Instituto de Computação - UNICAMP

MC514 - Sistemas Operacionais: Teoria e Prática

Islene Calciolari Garcia

Campeonato com Futex

Introdução

O algoritmo do desempate proposto por Peterson pode ser escrito de forma que as duas threads possam usar o mesmo código:
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.

Implementação

Utilize como base o arquivo 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:

O número de threads deve ser passado como argumento para o programa campeonato na linha de comando, como em: 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.

Entrega

Será no dia 7 de abril.

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.