Я взламываю задание uni и обнаружил проблему с моим кодом, который должен порождать 2 процесса, где второй процесс ожидает завершения первого перед выполнением. Вот что у меня есть:
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);
Теперь я знаю, что в «реальном мире» это действительно глупо. Если мой «потребитель» ничего не делает, пока мой «производитель» не завершит работу, то у вас может не быть двух таких процессов, но назначение пытается проиллюстрировать состояние гонки, поэтому нам специально сказали сделайте это так.
Итак, моя проблема в том, что процесс-потребитель не ждет производителя. Я предположил, что, поскольку семафор был отключен в производителе ( sem_wait (& mutex);
), он не будет доступен потребителю до тех пор, пока не будет вызван sem_post (& mutex);
производитель.
Кроме того, насколько я могу судить, строка wait (NULL);
isn ' t ждать завершения обоих процессов.
Я что-то критически неправильно понял?