Почему мой мьютекс не работает должным образом в многопроцессорном приложении C?

Я взламываю задание 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 ждать завершения обоих процессов.

Я что-то критически неправильно понял?

5
задан Bill the Lizard 20 September 2012 в 12:47
поделиться