Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Fecha: 29/febrero/2020
Cinco filósofos están sentados alrededor de una mesa y pasan su vida cenando y pensando. Cada
filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son
necesarios dos tenedores y cada filósofo sólo puede tomar el tenedor que está a su izquierda y el
esperando, con el tenedor en la mano, hasta que pueda tomar el otro tenedor, para luego empezar
a comer. El resto de los filósofos que no está ni comiendo ni con un tenedor en la mano está
pensando.
sistema operativo. Se trata de lanzar cinco procesos (filósofos) y ponerles a competir por obtener
unos recursos. La solución consiste en configurar para que estos procesos (filósofos) puedan
acceder a los recursos (dos tenedores) y desarrollar el trabajo (puedan comer). El problema es
que el algoritmo de solución debe ser justo y no debe permitir que uno de ellos ocupe todo el
sistema y no deje comer a los demás o que entre ellos se bloqueen y ninguno pueda tener acceso
Lógicamente si son cinco filósofos y hay cinco tenedores el algoritmo debe permitir que la
mayor parte del tiempo haya dos filósofos comiendo y uno pensando. Pero además se deben
Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condición
de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.
Si todos los filósofos toman el tenedor que está a su derecha al mismo tiempo, entonces todos se
quedarán esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
hará porque todos se encuentran en la misma situación (esperando que alguno deje sus
tenedores). Entonces los filósofos se morirán de hambre. Este bloqueo mutuo se denomina
interbloqueo o deadlock
Resumiendo: El problema consiste en encontrar un algoritmo que permita que los filósofos
nunca se mueran de hambre y que el comedor esté dando de comer constantemente y de una
Problema resuelto en C
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
pthread_t philosopher[5];
pthread_mutex_t chopstick[5];
int main() {
int i;
void *msg;
for(i=1;i<=5;i++) {
pthread_mutex_init(&chopstick[i],NULL); }
for(i=1;i<=5;i++) {
for(i=1;i<=5;i++) {
pthread_join(philosopher[i],&msg);}
for(i=1;i<=5;i++) {
pthread_mutex_destroy(&chopstick[i]); }
return 0; }
void *func(int n) {
pthread_mutex_lock(&chopstick[n]);
pthread_mutex_lock(&chopstick[(n+1)%5]);
pthread_mutex_unlock(&chopstick[n]);
pthread_mutex_unlock(&chopstick[(n+1)%5]);
El problema de la cena de los filósofos es útil para modelar procesos que compiten por el
exceso exclusivo a un numero de recursos, como una unidad de cinta u otro dispositivo
E/S.
problema-de-los-filosofos/
cena-de-los-filosofos/