У меня большие проблемы с семафорами в 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);
mutex
)? Другое дело, вы приобретаете мьютекс, но освобождаете его только в другом состоянии. Это предполагаемое поведение? - person holgac   schedule 22.04.2015barrier
? Код в вашей ссылке используетmutex.signal()
вместоbarrier.wait()
, как в вашем коде. Еще одно замечание:sem_post
не переключится на другой процесс, вызывающий процесс продолжит работу. Код в ссылке, кажется, полагается на получение мьютекса, чтобы остановить текущий процесс. - person holgac   schedule 22.04.2015