IIC 2332 -- Sistemas Operativos
Apuntes A02
1er Semestre 1996

Threads en Nachos

Variables de Condición

Filósofos comensales

Los filósofos empiezan en el estado pensando.
var estado: array[0..4] of (pensando, hambriento, comiendo)
var sí-mismo: array[0..4] of condition
var mutex of lock

tomar(i: 0..4)
  acquire(mutex)
  estado[i] := hambriento
  probar(i)
  if estado[i] <> comiendo then sí-mismo[i].wait(mutex)
  release(mutex)

dejar(i: 0..4)
  acquire(mutex)
  estado[i] := pensando
  probar(izquierda(i))
  probar(derecha(i))
  release(mutex)

probar(i: 0..4)
  if estado[i] = hambriento
     and estado[izquierda(i)] <> comiendo
     and estado[derecha(i)]   <> comiendo then
       estado[i] := comiendo             (* A *)
       sí-mismo[i].signal(mutex)
¿Qué pasa si se coloca la línea A en tomar en vez de probar?
Last edited April 16, 1996, by knabe@ing.puc.cl