Puesto que usted quiere saber how to code your algorithm for 1 restroom
, que lo han hecho en C. Será una tarea bastante sencilla para convertirlo en C--, como todas las construcciones de semáforos parecen bastante similares.
Por lo que pude hacer de su respuesta,
C: sem_wait() C--: wait()
sem_post() signal()
sem_t semaphore()
sem_init() initialsem()
Tenga en cuenta, como se ha dicho, que han trabajado el problema de 1-baño solamente. Como esto es tarea, espero que lo expanda usted mismo en el formulario 2-sanos.
Trabajar el propio camino de la Readers-writers problem a nuestro problema "unisex de baños", que hacen uso de las siguientes variables globales:
int mcount,wcount; // count of number of men/women in restroom
sem_t x,y,z; // semaphores for updating mcount & wcount values safely
sem_t wsem,msem; // semaphores to block other genders' entry
sem_t cap; // capacity of the restroom
La incorporación de estos semáforos & contadores en la función man
hilo,
void *man(void *param)
{
sem_wait(&z);
sem_wait(&msem);
sem_wait(&x);
mcount++;
if(mcount==1)
{ sem_wait(&wsem); } // first man in, make women wait
sem_post(&x);
sem_post(&msem);
sem_post(&z);
sem_wait(&cap); //wait here, if over capacity
printf("\t\tman in!\n");
delay();
printf("\t\t\tman out!\n");
sem_post(&cap); //one man has left, increase capacity
sem_wait(&x);
mcount--;
if(mcount==0)
{sem_post(&wsem);} // no man left, signal women
sem_post(&x);
}
Del mismo modo, la función de hilo de mujer, sustituye mcount
con wcount
, msem
con wsem
y x
con y
. Sólo z
permanece como está en la función man
, de modo que ambos man
woman
subprocesos cola en el mismo semáforo común.(Debido a esto, el código invariablemente tiene FIFO-como comportamiento, lo que asegura equidad/no-inanición)
El código completo es el siguiente: (Para compilar, utilice gcc filename -lpthread
)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
int mcount,wcount;
sem_t x,y,z,wsem,msem,cap;
void delay(void)
{
int i;
int delaytime;
delaytime = random();
for (i = 0; i<delaytime; i++);
}
void *woman(void *param)
{
sem_wait(&z);
sem_wait(&wsem);
sem_wait(&y);
wcount++;
if(wcount==1)
{ sem_wait(&msem); }
sem_post(&y);
sem_post(&wsem);
sem_post(&z);
sem_wait(&cap);
printf("woman in!\n");
delay();
printf("\twoman out!\n");
sem_post(&cap);
sem_wait(&y);
wcount--;
if(wcount==0)
{ sem_post(&msem); }
sem_post(&y);
}
void *man(void *param)
{
sem_wait(&z);
sem_wait(&msem);
sem_wait(&x);
mcount++;
if(mcount==1)
{ sem_wait(&wsem); }
sem_post(&x);
sem_post(&msem);
sem_post(&z);
sem_wait(&cap);
printf("\t\tman in!\n");
delay();
printf("\t\t\tman out!\n");
sem_post(&cap);
sem_wait(&x);
mcount--;
if(mcount==0)
{sem_post(&wsem);}
sem_post(&x);
}
int main(void)
{
int i;
srandom(60);
mcount = 0;
wcount = 0;
sem_init(&x,0,1); // for sem_init, initial value is 3rd argument
sem_init(&y,0,1);
sem_init(&z,0,1);
sem_init(&wsem,0,1);
sem_init(&msem,0,1);
sem_init(&cap,0,4); // eg. cap initialized to 4
pthread_t *tid;
tid = malloc(80*sizeof(pthread_t));
// You can use your cobegin statement here, instead of pthread_create()
// I have forgone the use of pthread barriers although I suppose they would nicely imitate the functionality of cobegin.
// This is merely to retain simplicity.
for(i=0;i<10;i++)
{
pthread_create(&tid[i],NULL,woman,NULL);
}
for(i=10;i<20;i++)
{
pthread_create(&tid[i],NULL,man,NULL);
}
for(i=0;i<20;i++)
{
pthread_join(tid[i],NULL);
}
return(0);
}
Mientras se convierte en el formulario 2-sanos, tome nota de las variables del contador de semáforos & que deberá duplicar para satisfacer todas las condiciones. Feliz semaforing!
qué tiene que ser óptima? –
No. Pero no puede tener inanición. Entonces los hombres y las mujeres deben usar el baño de manera justa. – Jen
No estoy seguro si estás preocupado por la inanición, pero estoy bastante seguro de que tu algoritmo tiene un problema de inanición. Imagine el caso en que aparece un hombre mientras una mujer ya está en el baño, y un flujo constante de mujeres sigue apareciendo para que el baño nunca se vacíe. –