Estoy pirateando una asignación uni y he encontrado un problema con mi código que se supone que engendra 2 procesos, donde el segundo proceso espera que el primero se complete antes de la ejecución. Esto es lo que tengo hasta ahora:¿Por qué mi mutex no funciona correctamente en una aplicación C multiproceso?
sem_t mutex;
int producer; int consumer;
sem_init(&mutex, 0, 1);
producer = fork();
consumer = fork();
if (producer == 0) {
if (VERBOSE) printf("Running producer\n");
/* down semaphore */
sem_wait(&mutex);
/* START CRITICAL REGION */
get_files(N);
/* END CRITICAL REGION */
/* up semaphore */
sem_post(&mutex);
if (VERBOSE) printf("Ending producer\n");
exit(0);
}
if (consumer == 0) {
if (VERBOSE) printf("Running consumer\n");
/* down semaphore */
sem_wait(&mutex);
/* START CRITICAL REGION */
/* do stuff */
/* END CRITICAL REGION */
/* up semaphore */
sem_post(&mutex);
if (VERBOSE) printf("Ending consumer\n");
exit(0);
}
/* parent waits for both to complete */
wait(NULL);
Ahora, sé que en el "mundo real" esto es realmente estúpida. Si mi 'consumidor' no hace nada hasta que mi 'productor' haya terminado, entonces bien podría no tener 2 procesos como este, pero la tarea es tratar de ilustrar una condición de carrera, por lo que nos han dicho específicamente hacerlo de esta forma.
Entonces, mi problema es que el proceso del consumidor no está esperando al productor. Supuse que como el semáforo se eliminó en el productor (sem_wait(&mutex);
), entonces no estaría disponible para el consumidor hasta que se llame al sem_post(&mutex);
en el productor.
Además, lo mejor que puedo decir es que la línea wait(NULL);
no está esperando que se completen ambos procesos.
¿He malinterpretado algo críticamente?
Bien pedido y bien etiquetado. – sje397
Crea procesos NO hilos. – tur1ng
tenedor comparte memoria ... debería ver y ser capaz de usar los mutexes del mismo modo no? (Puedo estar bien aquí, no lo he intentado) – tobyodavies