Параллельные процессы с использованием семафоров в C

У меня большие проблемы с семафорами в C. Вот ссылка на вдохновение моего кода: http://cse.unl.edu/~ylu/csce351/notes/Solution%20for%20Building%20H2O.pdf.

Есть два похожих кода для водорода и кислорода. Это идея: есть процессы, генерируемые для кислорода и водорода, и они создаются в разное время. Когда есть 2 водорода и 1 кислород, они вызывают функцию bond(). Но их надо дождаться. После того, как условие оценивается как ложное, предполагается переключение на другой процесс (по крайней мере, я так это понимаю). Но в моем коде он переходит к следующей команде, из-за чего он не будет ждать всех процессов, которые мне нужны. Он печатает вывод после каждого созданного процесса, даже если он должен ждать. Кто-нибудь знает, что там не так?

(Я могу опубликовать больше кода, если этого недостаточно.)

КИСЛОРОДНЫЙ КОД: (водород аналогичен)

sem_wait(mutex);
if ((*hydrogen >=2) && (*oxigen>=1))
{
    (*count_c)++;
    *count_cur_h-=2;
    sem_post(hydrel);
    sem_post(hydrel);
    *count_cur_o-=1;
    sem_post(oxrel);
}
else
{
    (*count_c)++;
    sem_post(mutex);   // This is the place where it is supposed
                       // to release and continue to another process,
                       // but it goes to the next command.
}

sem_wait(oxrel);
bond();
sem_wait(barrier);

//semaphores are initialized like this:
sem_init(mutex,1,1);
sem_init(oxrel,1,1);
sem_init(hydrel,1,2);
sem_init(barrier,1,3);

person Michael Erik    schedule 21.04.2015    source источник
comment
Как вы определяете эти мьютексы, где они? Они должны быть расположены в общей памяти, поскольку вы создаете мьютексы, которые совместно используются процессами. Кроме того, когда вы говорите перейти к другому процессу в своем комментарии, вы имеете в виду пробуждение другого процесса (ожидание mutex)? Другое дело, вы приобретаете мьютекс, но освобождаете его только в другом состоянии. Это предполагаемое поведение?   -  person holgac    schedule 22.04.2015
comment
Семафоры находятся в общей памяти. И я имел в виду, что продолжайте ждать, пока не будет 2 водорода и кислорода. Это должно быть предполагаемое поведение - когда вы смотрите на ссылку, там то же самое (то же самое в книге, книжке семафоров, которая используется в качестве ссылки в нашем школьном проекте)   -  person Michael Erik    schedule 22.04.2015
comment
Кроме того, где в вашем коде высвобождается barrier? Код в вашей ссылке использует mutex.signal() вместо barrier.wait(), как в вашем коде. Еще одно замечание: sem_post не переключится на другой процесс, вызывающий процесс продолжит работу. Код в ссылке, кажется, полагается на получение мьютекса, чтобы остановить текущий процесс.   -  person holgac    schedule 22.04.2015
comment
барьер высвобождается в функции связи. Да, он использует барьер. ожидание, но это всего лишь аддон. Этот код, который я опубликовал, предназначен для кислорода, а код для водорода использует mutex.signal(). Я знаю, что он не переключится на другой процесс, но он должен освободить процесс (я думаю).   -  person Michael Erik    schedule 22.04.2015


Ответы (1)


sem_post не является блокирующим вызовом. sem_wait — это блокирующий вызов. Если значение семафора равно нулю при вызове sem_wait, функция, вызвавшая его, будет заблокирована. sem_post используется для освобождения другого потока, который блокирует ожидание sem_wait, когда значение семафора равно нулю, но сам не блокируется. Вызов sem_post используется для «пробуждения потока, ожидающего sem-wait», но затем продолжается, и оба потока будут выполняться одновременно (если у вас есть как минимум 2 логических процессора). Если вы хотите, чтобы поток, вызвавший sem_post, заблокировался в этот момент, вам нужно будет сделать что-то еще (например, добавить еще один семафор).

person ckolivas    schedule 29.04.2015