Sistemas Operativos 3º Ano MIEEC
Folha de Problemas nº 7: Variáveis de Condição POSIX

Questões

  1. Sobre variáveis de condição POSIX. Admita que o thread A executa pthread_cond_signal() e que imediatamente a seguir o thread B executa a função pthread_cond_wait() sobre a mesma variável de condição. Para cada um dos seguintes cenários:
    1. pthread_cond_signal() desbloqueou o thread C que estava bloqueado nessa variável de condição;
    2. pthread_cond_signal() não desbloqueou qualquer thread bloqueado nessa variável de condição.
    indique qual o resultado da invocação de pthread_cond_wait() pelo segundo thread? Justifique.
  2. As primitivas pthread_cond_wait()/pthread_cond_signal() são muito parecidas com as primitivas sleep()/wakeup() usadas na ilustração do problema do lost-wakeup nas aulas teóricas. Por que razão as primitivas de pthread_cond_t não causam o mesmo problema?

Problemas

Nota

Os seus programas deverão usar a biblioteca libpthread. Não se esqueça de indicá-lo ao compilador, i.e. especificar -lpthread na linha de comandos.

Deverá ainda definir a variável _REENTRANT na linha de comandos do gcc, usando o argumento -D_REENTRANT, para garantir que o compilador usa as funções apropriadas da biblioteca C.

Por outras palavras, invoque o compilador de C da seguinte maneira:

 gcc -D_REENTRANT -lpthread
  1. Na solução do problema do bounded buffer com mutexes (problema 2 da folha5) os threads eram forçados a realizar uma espera activa. Uma das vantagens das variáveis de condição é precisamente eliminar a necessidade de espera activa.
    1. Modifique a sua implementação do bounded buffer com mutexes, i.e. o tipo bbuf_t e as funções enter() e remove() para usar variáveis de condição.
    2. Teste a sua implementação do bounded buffer usando programa semelhante ao que usou no problema 1 da folha6, e no problema 2 da folha5.

      Sugestão: Modifique a sua solução para o problema 2 da folha5. Seja muito cuidadoso, doutro modo pode introduzir bugs muito difíceis de detectar.

      IMP Use a função check() para detectar se o bounded buffer é corrompido devido a race conditions.

    3. Compare os tempos de execução desta solução com aqueles que obteve nas soluções com mutexes e com semáforos. Tente explicar as diferenças observadas.
  2. Resolva o problema 2 da folha6 -- i.e. o problema dos readers-writers -- usando mutexes e variáveis de condição POSIX.
  3. Resolva o problema 3 da folha6 -- i.e. o algoritmo merge-sort -- usando mutexes e variáveis de condição POSIX.

This document was translated from LATEX by HEVEA.